{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 泰坦尼克号数据科学解决方案\n",
    "\n",
    "- 比赛链接：https://www.kaggle.com/c/titanic/overview/tutorials\n",
    "- 原文链接：https://www.kaggle.com/startupsci/titanic/titanic-data-science-solutions\n",
    "\n",
    "本笔记本的目标是按照逐步的工作流程，解释我们在解决方案开发过程中做出的每个决定的每个步骤和基本原理。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 工作流程\n",
    "\n",
    "根据 [Data Science Solutions](https://www.amazon.com/Data-Science-Solutions-Startup-Workflow/dp/1520545312)书中描述的七个阶段。\n",
    "1. 问题定义\n",
    "2. 获取训练和测试数据\n",
    "3. 处理、准备、清洗数据\n",
    "4. 分析、识别模式和探索数据\n",
    "5. 建模、预测和解决问题\n",
    "6. 可视化，报告和呈现问题解决步骤和最终解决方案\n",
    "7. 提供结果\n",
    "\n",
    "## 问题定义\n",
    "\n",
    "根据训练数据中的乘客存活与否的信息，建立模型，在测试集中预测乘客是否存活。\n",
    "\n",
    "注意点：\n",
    "- 1912年4月15日，在她的处女航中，泰坦尼克号在与冰山相撞后沉没，2224名乘客和机组人员中有1502人死亡。即生存率为32％。\n",
    "- 造成海难失事的原因之一是乘客和机组人员没有足够的救生艇。\n",
    "- 尽管幸存下沉有一些运气因素，但有些人比其他人更容易生存，例如妇女，儿童和上流社会。\n",
    "\n",
    "## 工作流目标\n",
    "\n",
    "数据科学解决方案工作流程解决了七个主要目标。\n",
    "\n",
    "**分类** 我们可能希望对样本进行分类。我们可能还想了解不同类的含义或与我们的目标的相关性。\n",
    "\n",
    "**相关** 可以基于训练数据集内的可用特征来解决问题。数据集中的哪些特征对我们的目标有重大贡献？从统计学上讲，特征和目标之间是否存在相关性？随着特征值的变化，解决方案状态也会发生变化，反之亦然？这可以针对给定数据集中的数值和类别特征进行测试。我们可能还希望确定除后续目标和工作流程阶段之外的特征之间的相关性。关联某些特征可能有助于创建，补全或更正特征。\n",
    "\n",
    "**转换** 对于建模阶段，需要准备数据。根据模型算法的选择，可能需要将所有特征转换为数值等效值。例如，将文本分类值转换为数值。\n",
    "\n",
    "**补全** 数据准备可能还需要我们估计特征中的任何缺失值。当没有缺失值时，模型算法可能最有效。\n",
    "\n",
    "**纠正** 我们还可以分析给定的训练数据集中的错误或可能在特征内提取值特征内的错误值，并尝试纠正这些值或排除包含错误的样本。一种方法是检测我们的样本或特征中的任何异常值。如果某项特征不对分析做出贡献，或者可能会严重影响结果，我们也可能完全丢弃该特征。\n",
    "\n",
    "**创建** 我们是否可以基于现有的特征或一组特征创建新特征，以便新特征遵循关联，转换和完整性目标。\n",
    "\n",
    "**图表** 如何根据数据的性质和解决方案目标选择正确的可视化图表。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 导入相关库"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-18T14:33:17.129971Z",
     "start_time": "2019-08-18T14:33:02.245692Z"
    }
   },
   "outputs": [],
   "source": [
    "# 数据分析和处理\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import random as rnd\n",
    "\n",
    "# 可视化\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "# 机器学习\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.svm import SVC, LinearSVC\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.naive_bayes import GaussianNB\n",
    "from sklearn.linear_model import Perceptron\n",
    "from sklearn.linear_model import SGDClassifier\n",
    "from sklearn.tree import DecisionTreeClassifier"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 获取数据\n",
    "\n",
    "使用 Pandas， 讲训练数据和测试数据存入 DataFrames。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-18T14:33:19.004850Z",
     "start_time": "2019-08-18T14:33:18.619882Z"
    }
   },
   "outputs": [],
   "source": [
    "train_df = pd.read_csv('./data/train.csv')\n",
    "test_df = pd.read_csv('./data/test.csv')\n",
    "combine = [train_df, test_df]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 通过描述数据来进行分析\n",
    "\n",
    "Pandas 能够帮助我们描述数据，回答以下问题。\n",
    "\n",
    "**哪些特征在数据几中有用？**\n",
    "\n",
    "具体特征描述可看 https://www.kaggle.com/c/titanic/data\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-13T17:00:31.678553Z",
     "start_time": "2019-08-13T17:00:31.674563Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['PassengerId' 'Survived' 'Pclass' 'Name' 'Sex' 'Age' 'SibSp' 'Parch'\n",
      " 'Ticket' 'Fare' 'Cabin' 'Embarked']\n"
     ]
    }
   ],
   "source": [
    "print(train_df.columns.values)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**哪些特征是类别特征？**\n",
    "\n",
    "这些值将样本分类为类似样本的集合。在类别特征中，基于名字，序数，比率或区间的值？ 除此之外，这有助于我们选择适当的可视化图。\n",
    "\n",
    "- 类别： Survived, Sex, and Embarked. Ordinal: Pclass.\n",
    "\n",
    "**哪些特征是数值特征？**\n",
    "\n",
    "这些值随样本而变化。 在数值特征中，值是离散的，连续的还是基于时间序列的？ 除此之外，这有助于我们选择适当的可视化图。\n",
    "\n",
    "- 连续值: Age, Fare. 离散值: SibSp, Parch."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-12T16:18:50.404543Z",
     "start_time": "2019-08-12T16:18:49.793149Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Name</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Ticket</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Cabin</th>\n",
       "      <th>Embarked</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Braund, Mr. Owen Harris</td>\n",
       "      <td>male</td>\n",
       "      <td>22.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>A/5 21171</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n",
       "      <td>female</td>\n",
       "      <td>38.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>PC 17599</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C85</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>Heikkinen, Miss. Laina</td>\n",
       "      <td>female</td>\n",
       "      <td>26.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>STON/O2. 3101282</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Futrelle, Mrs. Jacques Heath (Lily May Peel)</td>\n",
       "      <td>female</td>\n",
       "      <td>35.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>113803</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>C123</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Allen, Mr. William Henry</td>\n",
       "      <td>male</td>\n",
       "      <td>35.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>373450</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Survived  Pclass  \\\n",
       "0            1         0       3   \n",
       "1            2         1       1   \n",
       "2            3         1       3   \n",
       "3            4         1       1   \n",
       "4            5         0       3   \n",
       "\n",
       "                                                Name     Sex   Age  SibSp  \\\n",
       "0                            Braund, Mr. Owen Harris    male  22.0      1   \n",
       "1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1   \n",
       "2                             Heikkinen, Miss. Laina  female  26.0      0   \n",
       "3       Futrelle, Mrs. Jacques Heath (Lily May Peel)  female  35.0      1   \n",
       "4                           Allen, Mr. William Henry    male  35.0      0   \n",
       "\n",
       "   Parch            Ticket     Fare Cabin Embarked  \n",
       "0      0         A/5 21171   7.2500   NaN        S  \n",
       "1      0          PC 17599  71.2833   C85        C  \n",
       "2      0  STON/O2. 3101282   7.9250   NaN        S  \n",
       "3      0            113803  53.1000  C123        S  \n",
       "4      0            373450   8.0500   NaN        S  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 预览数据\n",
    "train_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**哪些特征有多种数据类型？**\n",
    "- 船票混合了数字和字母。Cabin（船舱）是字母加数字的。\n",
    "\n",
    "**哪些特征包含错误？**\n",
    "\n",
    "在大数据集上这一问题难以查看，但是我们可以通过检查小数据集的样本来知晓哪些特征需要修正。\n",
    "\n",
    "- 名字特征可能包含错误或拼写错误，因为有几种方法可用于描述名字，包括标题，圆括号和用于替代或短名称的引号。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-12T16:28:21.705712Z",
     "start_time": "2019-08-12T16:28:21.694773Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Name</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Ticket</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Cabin</th>\n",
       "      <th>Embarked</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>886</th>\n",
       "      <td>887</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>Montvila, Rev. Juozas</td>\n",
       "      <td>male</td>\n",
       "      <td>27.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>211536</td>\n",
       "      <td>13.00</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>887</th>\n",
       "      <td>888</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Graham, Miss. Margaret Edith</td>\n",
       "      <td>female</td>\n",
       "      <td>19.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>112053</td>\n",
       "      <td>30.00</td>\n",
       "      <td>B42</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>888</th>\n",
       "      <td>889</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Johnston, Miss. Catherine Helen \"Carrie\"</td>\n",
       "      <td>female</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>W./C. 6607</td>\n",
       "      <td>23.45</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>889</th>\n",
       "      <td>890</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Behr, Mr. Karl Howell</td>\n",
       "      <td>male</td>\n",
       "      <td>26.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>111369</td>\n",
       "      <td>30.00</td>\n",
       "      <td>C148</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>890</th>\n",
       "      <td>891</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Dooley, Mr. Patrick</td>\n",
       "      <td>male</td>\n",
       "      <td>32.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>370376</td>\n",
       "      <td>7.75</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Q</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     PassengerId  Survived  Pclass                                      Name  \\\n",
       "886          887         0       2                     Montvila, Rev. Juozas   \n",
       "887          888         1       1              Graham, Miss. Margaret Edith   \n",
       "888          889         0       3  Johnston, Miss. Catherine Helen \"Carrie\"   \n",
       "889          890         1       1                     Behr, Mr. Karl Howell   \n",
       "890          891         0       3                       Dooley, Mr. Patrick   \n",
       "\n",
       "        Sex   Age  SibSp  Parch      Ticket   Fare Cabin Embarked  \n",
       "886    male  27.0      0      0      211536  13.00   NaN        S  \n",
       "887  female  19.0      0      0      112053  30.00   B42        S  \n",
       "888  female   NaN      1      2  W./C. 6607  23.45   NaN        S  \n",
       "889    male  26.0      0      0      111369  30.00  C148        C  \n",
       "890    male  32.0      0      0      370376   7.75   NaN        Q  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df.tail()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**哪些特征包含空格，null 或空值？**\n",
    "\n",
    "这些特征需要修正。\n",
    "\n",
    "- Cabin > Age > Embarked 特征包含 NUll 值。\n",
    "\n",
    "**特征的数据类型是什么？**\n",
    "\n",
    "特征转换时有用。\n",
    "\n",
    "- 七个特征是整数或浮点数。 在测试数据集的情况下为六。\n",
    "- 五个特征是字符串(Object)。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-12T16:33:15.484345Z",
     "start_time": "2019-08-12T16:33:14.919855Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 891 entries, 0 to 890\n",
      "Data columns (total 12 columns):\n",
      "PassengerId    891 non-null int64\n",
      "Survived       891 non-null int64\n",
      "Pclass         891 non-null int64\n",
      "Name           891 non-null object\n",
      "Sex            891 non-null object\n",
      "Age            714 non-null float64\n",
      "SibSp          891 non-null int64\n",
      "Parch          891 non-null int64\n",
      "Ticket         891 non-null object\n",
      "Fare           891 non-null float64\n",
      "Cabin          204 non-null object\n",
      "Embarked       889 non-null object\n",
      "dtypes: float64(2), int64(5), object(5)\n",
      "memory usage: 83.6+ KB\n",
      "________________________________________\n",
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 418 entries, 0 to 417\n",
      "Data columns (total 11 columns):\n",
      "PassengerId    418 non-null int64\n",
      "Pclass         418 non-null int64\n",
      "Name           418 non-null object\n",
      "Sex            418 non-null object\n",
      "Age            332 non-null float64\n",
      "SibSp          418 non-null int64\n",
      "Parch          418 non-null int64\n",
      "Ticket         418 non-null object\n",
      "Fare           417 non-null float64\n",
      "Cabin          91 non-null object\n",
      "Embarked       418 non-null object\n",
      "dtypes: float64(2), int64(4), object(5)\n",
      "memory usage: 36.0+ KB\n"
     ]
    }
   ],
   "source": [
    "train_df.info()\n",
    "print('_'*40)\n",
    "test_df.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**本中数值特征值的分布是什么？**\n",
    "\n",
    "这能帮助我们提前了解训练数据集如何体现实际问题。\n",
    "\n",
    "- 样本数为 891 \n",
    "- Surived 是 0 1类别特征\n",
    "- 大约 38% 的样本是幸存的\n",
    "- 大部分乘客（>75%）没有父母或者孩子在船上\n",
    "- 大约 30% 乘客有兄妹或者配偶\n",
    "- 票价差异很大，<1% 的乘客票价高达 $512\n",
    "- <1% 的乘客年龄在 65-80"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-12T16:40:56.302373Z",
     "start_time": "2019-08-12T16:40:56.276413Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Fare</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>714.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>446.000000</td>\n",
       "      <td>0.383838</td>\n",
       "      <td>2.308642</td>\n",
       "      <td>29.699118</td>\n",
       "      <td>0.523008</td>\n",
       "      <td>0.381594</td>\n",
       "      <td>32.204208</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>257.353842</td>\n",
       "      <td>0.486592</td>\n",
       "      <td>0.836071</td>\n",
       "      <td>14.526497</td>\n",
       "      <td>1.102743</td>\n",
       "      <td>0.806057</td>\n",
       "      <td>49.693429</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.420000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>223.500000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>20.125000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>7.910400</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>446.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>28.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>14.454200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>668.500000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>38.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>31.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>891.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>8.000000</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>512.329200</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       PassengerId    Survived      Pclass         Age       SibSp  \\\n",
       "count   891.000000  891.000000  891.000000  714.000000  891.000000   \n",
       "mean    446.000000    0.383838    2.308642   29.699118    0.523008   \n",
       "std     257.353842    0.486592    0.836071   14.526497    1.102743   \n",
       "min       1.000000    0.000000    1.000000    0.420000    0.000000   \n",
       "25%     223.500000    0.000000    2.000000   20.125000    0.000000   \n",
       "50%     446.000000    0.000000    3.000000   28.000000    0.000000   \n",
       "75%     668.500000    1.000000    3.000000   38.000000    1.000000   \n",
       "max     891.000000    1.000000    3.000000   80.000000    8.000000   \n",
       "\n",
       "            Parch        Fare  \n",
       "count  891.000000  891.000000  \n",
       "mean     0.381594   32.204208  \n",
       "std      0.806057   49.693429  \n",
       "min      0.000000    0.000000  \n",
       "25%      0.000000    7.910400  \n",
       "50%      0.000000   14.454200  \n",
       "75%      0.000000   31.000000  \n",
       "max      6.000000  512.329200  "
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-12T16:53:37.099931Z",
     "start_time": "2019-08-12T16:53:37.076993Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Fare</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>714.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>446.000000</td>\n",
       "      <td>0.383838</td>\n",
       "      <td>2.308642</td>\n",
       "      <td>29.699118</td>\n",
       "      <td>0.523008</td>\n",
       "      <td>0.381594</td>\n",
       "      <td>32.204208</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>257.353842</td>\n",
       "      <td>0.486592</td>\n",
       "      <td>0.836071</td>\n",
       "      <td>14.526497</td>\n",
       "      <td>1.102743</td>\n",
       "      <td>0.806057</td>\n",
       "      <td>49.693429</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.420000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>446.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>28.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>14.454200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>61%</th>\n",
       "      <td>543.900000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>23.225000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>62%</th>\n",
       "      <td>552.800000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>24.150000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>891.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>8.000000</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>512.329200</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       PassengerId    Survived      Pclass         Age       SibSp  \\\n",
       "count   891.000000  891.000000  891.000000  714.000000  891.000000   \n",
       "mean    446.000000    0.383838    2.308642   29.699118    0.523008   \n",
       "std     257.353842    0.486592    0.836071   14.526497    1.102743   \n",
       "min       1.000000    0.000000    1.000000    0.420000    0.000000   \n",
       "50%     446.000000    0.000000    3.000000   28.000000    0.000000   \n",
       "61%     543.900000    0.000000    3.000000   32.000000    0.000000   \n",
       "62%     552.800000    1.000000    3.000000   32.000000    0.000000   \n",
       "max     891.000000    1.000000    3.000000   80.000000    8.000000   \n",
       "\n",
       "            Parch        Fare  \n",
       "count  891.000000  891.000000  \n",
       "mean     0.381594   32.204208  \n",
       "std      0.806057   49.693429  \n",
       "min      0.000000    0.000000  \n",
       "50%      0.000000   14.454200  \n",
       "61%      0.000000   23.225000  \n",
       "62%      0.000000   24.150000  \n",
       "max      6.000000  512.329200  "
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 通过 `percentiles=[.61, .62]` 知道生存率为 38%\n",
    "train_df.describe(percentiles=[.61, .62])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-12T16:55:32.432496Z",
     "start_time": "2019-08-12T16:55:32.408591Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Fare</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>714.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>446.000000</td>\n",
       "      <td>0.383838</td>\n",
       "      <td>2.308642</td>\n",
       "      <td>29.699118</td>\n",
       "      <td>0.523008</td>\n",
       "      <td>0.381594</td>\n",
       "      <td>32.204208</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>257.353842</td>\n",
       "      <td>0.486592</td>\n",
       "      <td>0.836071</td>\n",
       "      <td>14.526497</td>\n",
       "      <td>1.102743</td>\n",
       "      <td>0.806057</td>\n",
       "      <td>49.693429</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.420000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>446.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>28.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>14.454200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>668.500000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>38.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>31.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>80%</th>\n",
       "      <td>713.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>39.687500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>891.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>8.000000</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>512.329200</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       PassengerId    Survived      Pclass         Age       SibSp  \\\n",
       "count   891.000000  891.000000  891.000000  714.000000  891.000000   \n",
       "mean    446.000000    0.383838    2.308642   29.699118    0.523008   \n",
       "std     257.353842    0.486592    0.836071   14.526497    1.102743   \n",
       "min       1.000000    0.000000    1.000000    0.420000    0.000000   \n",
       "50%     446.000000    0.000000    3.000000   28.000000    0.000000   \n",
       "75%     668.500000    1.000000    3.000000   38.000000    1.000000   \n",
       "80%     713.000000    1.000000    3.000000   41.000000    1.000000   \n",
       "max     891.000000    1.000000    3.000000   80.000000    8.000000   \n",
       "\n",
       "            Parch        Fare  \n",
       "count  891.000000  891.000000  \n",
       "mean     0.381594   32.204208  \n",
       "std      0.806057   49.693429  \n",
       "min      0.000000    0.000000  \n",
       "50%      0.000000   14.454200  \n",
       "75%      0.000000   31.000000  \n",
       "80%      1.000000   39.687500  \n",
       "max      6.000000  512.329200  "
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 通过 `percentiles=[.75, .8]` 查看 Parch 分布\n",
    "train_df.describe(percentiles=[.75, .8])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-12T16:56:03.361782Z",
     "start_time": "2019-08-12T16:56:03.336887Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Fare</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>714.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>446.000000</td>\n",
       "      <td>0.383838</td>\n",
       "      <td>2.308642</td>\n",
       "      <td>29.699118</td>\n",
       "      <td>0.523008</td>\n",
       "      <td>0.381594</td>\n",
       "      <td>32.204208</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>257.353842</td>\n",
       "      <td>0.486592</td>\n",
       "      <td>0.836071</td>\n",
       "      <td>14.526497</td>\n",
       "      <td>1.102743</td>\n",
       "      <td>0.806057</td>\n",
       "      <td>49.693429</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.420000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>446.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>28.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>14.454200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>68%</th>\n",
       "      <td>606.200000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>35.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>26.307500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>69%</th>\n",
       "      <td>615.100000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>35.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>26.550000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>891.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>8.000000</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>512.329200</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       PassengerId    Survived      Pclass         Age       SibSp  \\\n",
       "count   891.000000  891.000000  891.000000  714.000000  891.000000   \n",
       "mean    446.000000    0.383838    2.308642   29.699118    0.523008   \n",
       "std     257.353842    0.486592    0.836071   14.526497    1.102743   \n",
       "min       1.000000    0.000000    1.000000    0.420000    0.000000   \n",
       "50%     446.000000    0.000000    3.000000   28.000000    0.000000   \n",
       "68%     606.200000    1.000000    3.000000   35.000000    0.000000   \n",
       "69%     615.100000    1.000000    3.000000   35.000000    1.000000   \n",
       "max     891.000000    1.000000    3.000000   80.000000    8.000000   \n",
       "\n",
       "            Parch        Fare  \n",
       "count  891.000000  891.000000  \n",
       "mean     0.381594   32.204208  \n",
       "std      0.806057   49.693429  \n",
       "min      0.000000    0.000000  \n",
       "50%      0.000000   14.454200  \n",
       "68%      0.000000   26.307500  \n",
       "69%      0.000000   26.550000  \n",
       "max      6.000000  512.329200  "
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 通过 `percentiles=[.68, .69]` 查看 SibSp 分布\n",
    "train_df.describe(percentiles=[.68, .69])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-12T16:56:20.765271Z",
     "start_time": "2019-08-12T16:56:20.730363Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Fare</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>714.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "      <td>891.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>446.000000</td>\n",
       "      <td>0.383838</td>\n",
       "      <td>2.308642</td>\n",
       "      <td>29.699118</td>\n",
       "      <td>0.523008</td>\n",
       "      <td>0.381594</td>\n",
       "      <td>32.204208</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>257.353842</td>\n",
       "      <td>0.486592</td>\n",
       "      <td>0.836071</td>\n",
       "      <td>14.526497</td>\n",
       "      <td>1.102743</td>\n",
       "      <td>0.806057</td>\n",
       "      <td>49.693429</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.420000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10%</th>\n",
       "      <td>90.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>14.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>7.550000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20%</th>\n",
       "      <td>179.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>19.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>7.854200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30%</th>\n",
       "      <td>268.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>22.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>8.050000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40%</th>\n",
       "      <td>357.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>25.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>10.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>446.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>28.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>14.454200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>60%</th>\n",
       "      <td>535.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>31.800000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>21.679200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>70%</th>\n",
       "      <td>624.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>36.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>27.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>80%</th>\n",
       "      <td>713.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>39.687500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>90%</th>\n",
       "      <td>802.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>50.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>77.958300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>99%</th>\n",
       "      <td>882.100000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>65.870000</td>\n",
       "      <td>5.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>249.006220</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>891.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>8.000000</td>\n",
       "      <td>6.000000</td>\n",
       "      <td>512.329200</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       PassengerId    Survived      Pclass         Age       SibSp  \\\n",
       "count   891.000000  891.000000  891.000000  714.000000  891.000000   \n",
       "mean    446.000000    0.383838    2.308642   29.699118    0.523008   \n",
       "std     257.353842    0.486592    0.836071   14.526497    1.102743   \n",
       "min       1.000000    0.000000    1.000000    0.420000    0.000000   \n",
       "10%      90.000000    0.000000    1.000000   14.000000    0.000000   \n",
       "20%     179.000000    0.000000    1.000000   19.000000    0.000000   \n",
       "30%     268.000000    0.000000    2.000000   22.000000    0.000000   \n",
       "40%     357.000000    0.000000    2.000000   25.000000    0.000000   \n",
       "50%     446.000000    0.000000    3.000000   28.000000    0.000000   \n",
       "60%     535.000000    0.000000    3.000000   31.800000    0.000000   \n",
       "70%     624.000000    1.000000    3.000000   36.000000    1.000000   \n",
       "80%     713.000000    1.000000    3.000000   41.000000    1.000000   \n",
       "90%     802.000000    1.000000    3.000000   50.000000    1.000000   \n",
       "99%     882.100000    1.000000    3.000000   65.870000    5.000000   \n",
       "max     891.000000    1.000000    3.000000   80.000000    8.000000   \n",
       "\n",
       "            Parch        Fare  \n",
       "count  891.000000  891.000000  \n",
       "mean     0.381594   32.204208  \n",
       "std      0.806057   49.693429  \n",
       "min      0.000000    0.000000  \n",
       "10%      0.000000    7.550000  \n",
       "20%      0.000000    7.854200  \n",
       "30%      0.000000    8.050000  \n",
       "40%      0.000000   10.500000  \n",
       "50%      0.000000   14.454200  \n",
       "60%      0.000000   21.679200  \n",
       "70%      0.000000   27.000000  \n",
       "80%      1.000000   39.687500  \n",
       "90%      2.000000   77.958300  \n",
       "99%      4.000000  249.006220  \n",
       "max      6.000000  512.329200  "
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Age and Fare `[.1, .2, .3, .4, .5, .6, .7, .8, .9, .99]`\n",
    "train_df.describe(percentiles=[.1, .2, .3, .4, .5, .6, .7, .8, .9, .99])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**类别特征的分布如何？**\n",
    "\n",
    "- 姓名唯一（count=unique=891）\n",
    "- 65% 男性 （577/891）\n",
    "- 船舱（Cabin）有重复，说明有乘客共用船舱\n",
    "- Embarked 有三种取值，从 S 港登船的最多\n",
    "- Ticket 的重复率最高"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-12T17:09:28.904657Z",
     "start_time": "2019-08-12T17:09:28.881719Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Name</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Ticket</th>\n",
       "      <th>Cabin</th>\n",
       "      <th>Embarked</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>891</td>\n",
       "      <td>891</td>\n",
       "      <td>891</td>\n",
       "      <td>204</td>\n",
       "      <td>889</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>unique</th>\n",
       "      <td>891</td>\n",
       "      <td>2</td>\n",
       "      <td>681</td>\n",
       "      <td>147</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>top</th>\n",
       "      <td>Sdycoff, Mr. Todor</td>\n",
       "      <td>male</td>\n",
       "      <td>1601</td>\n",
       "      <td>C23 C25 C27</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>freq</th>\n",
       "      <td>1</td>\n",
       "      <td>577</td>\n",
       "      <td>7</td>\n",
       "      <td>4</td>\n",
       "      <td>644</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                      Name   Sex Ticket        Cabin Embarked\n",
       "count                  891   891    891          204      889\n",
       "unique                 891     2    681          147        3\n",
       "top     Sdycoff, Mr. Todor  male   1601  C23 C25 C27        S\n",
       "freq                     1   577      7            4      644"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# include=['O'] 为只输出离散型变量 （输出 Object 类型）\n",
    "train_df.describe(include=['O'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 基于数据分析的假设\n",
    "\n",
    "我们基于迄今为止所做的数据分析得出以下假设。 我们可能会在采取适当行动之前进一步验证这些假设。\n",
    "\n",
    "**相关性**\n",
    "\n",
    "每个特征与幸存的相关性。 希望在项目的早期阶段完成这项工作。\n",
    "\n",
    "**补全**\n",
    "\n",
    "1. 补全年龄特征，因为它一定与幸存相关\n",
    "2. 补全港口特征，因为日它可能与幸存或者其他特征相关联\n",
    "\n",
    "**纠正**\n",
    "\n",
    "1. Tickt 特征可以删除，因为它包含很多重复值（22%），并且Ticket和幸存应该没有关联\n",
    "2. Cabin 特征可以删除，因为它包含太多 null 值\n",
    "3. PassengerId 可以删除\n",
    "4. Name 特征可以删除\n",
    "\n",
    "**创建**\n",
    "\n",
    "1. 我们可以通过 Parch 和 SibSp 创建 Family 特征，从而获得船上的家庭成员总数\n",
    "2. 提取 Title 创建 Name 特征\n",
    "3. 创建年龄段特征，将数值特征离散化为顺序类别特征\n",
    "4. 创建 Fare 范围特征\n",
    "\n",
    "**分类**\n",
    "\n",
    "我们还可以根据前面提到的问题描述添加我们的假设。\n",
    "\n",
    "1. 女士更容易存活\n",
    "2. 儿童（age < ?）更容易存活\n",
    "3. 高级别的船票（Pclass=1）更容易存活"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 通过数据透视特征进行分析\n",
    "\n",
    "为了确认我们的一些观察和假设，我们可以通过聚合特征来快速分析我们的特征相关性。 我们只能在此阶段为没有任何空值的特征执行此操作。 对于分类（性别），序数（Pclass）或离散（SibSp，Parch）类型的特征，这样做也是有意义的。\n",
    "\n",
    "- **Pclass** 可以看到明显的关联性 Pclass=1时，有62.9% 的存活率。这以特征需要加入模型中\n",
    "- **Sex** Sex=female 有74%的存活率\n",
    "- **SibSp和Parch** 这些特征对于某些值具有零相关性。 最好从这些单独的特征中导出一个特征或一组特征.(当我们说关系/相关时，我们并不是指在任何特定值上找到它，而是当一个增加时，另一个增加/减少（例如，你拥有的兄弟姐妹越多，你的机会就越高））。 当SibSp或Parch的数量增加时，存活率既不增加也不减少，它随机变化，与数字无关。 是的，没有5或8名SibSp的人幸免于难，但有2名SibSp的人比0名SibSp幸存下来，这意味着没有任何关系。)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-13T17:14:24.645095Z",
     "start_time": "2019-08-13T17:14:24.636118Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0.629630</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>0.472826</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>0.242363</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pclass  Survived\n",
       "0       1  0.629630\n",
       "1       2  0.472826\n",
       "2       3  0.242363"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# as_index=False , Pclass 就不回作为 Dataframe 的索引了， 默认为 True\n",
    "train_df[['Pclass', 'Survived']].groupby(['Pclass'], as_index=False).mean().sort_values(by='Survived', ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-13T17:05:07.884046Z",
     "start_time": "2019-08-13T17:05:07.875039Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Sex</th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>female</td>\n",
       "      <td>0.742038</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>male</td>\n",
       "      <td>0.188908</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      Sex  Survived\n",
       "0  female  0.742038\n",
       "1    male  0.188908"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df[['Sex', 'Survived']].groupby(['Sex'], as_index=False).mean().sort_values(by='Survived', ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-13T17:06:43.896277Z",
     "start_time": "2019-08-13T17:06:43.887300Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>0.535885</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>0.464286</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0.345395</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>0.250000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>0.166667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>5</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>8</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   SibSp  Survived\n",
       "1      1  0.535885\n",
       "2      2  0.464286\n",
       "0      0  0.345395\n",
       "3      3  0.250000\n",
       "4      4  0.166667\n",
       "5      5  0.000000\n",
       "6      8  0.000000"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df[[\"SibSp\", \"Survived\"]].groupby(['SibSp'], as_index=False).mean().sort_values(by='Survived', ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-13T17:06:46.431468Z",
     "start_time": "2019-08-13T17:06:46.421496Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Parch</th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>0.600000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>0.550847</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>0.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0.343658</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>5</td>\n",
       "      <td>0.200000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>6</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Parch  Survived\n",
       "3      3  0.600000\n",
       "1      1  0.550847\n",
       "2      2  0.500000\n",
       "0      0  0.343658\n",
       "5      5  0.200000\n",
       "4      4  0.000000\n",
       "6      6  0.000000"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df[[\"Parch\", \"Survived\"]].groupby(['Parch'], as_index=False).mean().sort_values(by='Survived', ascending=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 通过可视化数据来进行分析\n",
    "\n",
    "现在我们可以继续使用可视化来确认我们的一些假设来分析数据。\n",
    "\n",
    "### 关联数值特征\n",
    "\n",
    "理解数值特征与目标的相关性。\n",
    "\n",
    "直方图可用于分析像Age这样的连续数值变量。 直方图可以使用自动定义的区间或等距离范围来表示样本的分布。 这有助于我们分析特定区间（婴幼儿的生存率是否更高？）\n",
    "\n",
    "**观察**\n",
    "\n",
    "- 婴幼儿（age<=4，数据集中最大你年龄为 80）有较高的存活率\n",
    "- 年纪最大的乘客（age=80）全部存活\n",
    "- 15-25岁的 乘客很大部分没有存活\n",
    "- 乘客的主要你年龄在 15-35 之间\n",
    "\n",
    "**决策**\n",
    "\n",
    "- 将 Age 放入模型中\n",
    "- 为 Age 补全 null 值\n",
    "- 应该为年龄分段"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-14T15:44:19.000295Z",
     "start_time": "2019-08-14T15:44:18.818751Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<seaborn.axisgrid.FacetGrid at 0x1c169f06cc0>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x216 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "g = sns.FacetGrid(train_df,  col='Survived')\n",
    "# 将 age 分为 20 个片段\n",
    "g.map(plt.hist, 'Age', bins=20)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 关联数值特征和序列特征\n",
    "\n",
    "我们可以在一个图中结合多个特征来分析相关性。这种方法可以应用在数值型和有数值的分类特征中。\n",
    "\n",
    "**观察**\n",
    "\n",
    "- Pclass=3 的乘客最多，存活率最低，与我们的假设相符\n",
    "- Pclass=2 和 Pclass=3 的婴幼儿大部分存活\n",
    "- Pclass=1 的乘客大部分存活\n",
    "- 不同的 Pclass 的年龄分布不同\n",
    "\n",
    "**决策**\n",
    "\n",
    "- 在模型训练中考虑 Pclass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-14T17:09:28.544300Z",
     "start_time": "2019-08-14T17:09:27.919941Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgAAAAHUCAYAAABMP5BeAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3X20ZGV55/3vj26IKCaIHLClYUDTGl4mYOggiisPQYltzAiTAZXxBeaBdMxjJmg0CmFi0OhSx1mCUZMVBgjoUmlEDIRlIAzSvkRtaOSdDjQi0ZaX7h4hSmKiDdfzR+3Ww+EcTp06VedU1f5+1qpVte/ae9d1V9VVddW9d+2dqkKSJLXLDosdgCRJWngWAJIktZAFgCRJLWQBIElSC1kASJLUQhYAkiS1kAWAJEktZAHQoySPJrkpyW1JPpvkqU8y75lJ3r6Q8c0Qxy8l+XqSf3+yeJJckOTIadr3THJFkpuT3JHkC32M7dwkB/RhPScl+Vgf1nNokluT3J3kz5NkvuvU8DKfxz6f35fku0keme+6xokFQO9+VFWHVNVBwI+BNy12QF34PvAHwP/qcfn3AFdX1cFVdQBw2lwWTrJkpvuq6pSquqPHuAbhL4HVwIrmsmpxw9GAmc/jnc9/Cxy22EEMGwuA/vgK8IsASd6Y5Jamqv7k1BmT/E6S65v7P7f9l0aS45tfHzcn+XLTdmCS65pfJrckWTGfIKtqc1VdD/ykx1UsAzZNWt8tTZxHJrlie3uSjyU5qbl9b5J3Jfkq8I4k102ab98k29exNsnKJL+X5H9OmuekJB9tbr9+0vPxV9s/gJL8tyR3JfkScESPffupJMuAn6+qr1fnUJmfAI6d73o1MsznMcrnpm/fqKr7+7GucWIBME9JlgKvAG5NciBwBnBUVR0MnDrNIpdW1a82928ATm7a3wW8vGl/VdP2JuAjVXUIsJJJyTrp8dc0CTT18sa+drTj48B5Sa5NckaSZ3e53L9V1Uuq6v3ATkme07S/Brh4yryXAL89afo1wJok+ze3j2iej0eB1zVf1u+m80FxNDDtsGOSX5/hefraNLPvxeOf601Nm8ac+dyVUctnzWDpYgcwwnZOclNz+yvAecDvApdU1VaAqvr+NMsdlOS9wK7ALsBVTfs/ABckuRi4tGn7OnBGkuV0Pmg2Tl1ZVb2mXx2aTVVd1ST7KjofkjcmOaiLRddMun0x8GrgA3Q+AB4Xf1VtSXJPksOBjcDz6Tw3bwYOBa5PZ3P8zsBm4IXA2qraAp0PUOB508R+LXBIl12dbnu/J80Yb+bz+OazZmAB0LsfNZXrT6XzTp7ti+IC4NiqurkZVjsSoKrelOSFwCuBm5IcUlWfTrKuabsqySlV9cUpj7mGTlJN9eGq+kQP/XpSzYfgp4FPN8OEvwY8yONHk54yZbF/mXR7DfDZJJd2VvfED8FmnlcD/wh8vqqqeW4vrKrTJ8+Y5Fi6+HJO8uvAWdPc9a9V9eIpbZuA5ZOmlwP3zfYYGmnm8/jms2ZgAdBf1wCfT3JWVf3fJLtN86vh6cD9SXYEXgd8DyDJc6tqHbAuyX8C9k7yC8A9VfXnTaX+y8DjPjAW8hdDkqOAb1TVvyZ5OvBc4DvAA8ABSX6OzofFS4GvTreOqvpWkkeBP+HxvyQmu5TO0Os/Ae9s2q4BLmue281JdqPzXK4DPpLkmcAPgOOBm6d53K5/MVTV/Ul+2PxqWQe8EfhoN8tqrJjPY5DPmpkFQB9V1e1J3gd8qUmKG4GTpsz2J3Te5P8E3ErnTQ/woXR2Cgqd5LiZzl65r0/yEzpJ+Z75xJfkWcB64OeBx5K8BTigqn7Q5SoOBT6WZBudXwjnNjsh0Qx13kJnmO/GWdazBvgQsN90d1bVQ0nuaGK7rmm7I8n/AP4+yQ50dnx6c1V9I8mZdIZX7we+Ccy4d/Ic/B6dX3c7A3/XXNQi5vP45HM6OyL+V+CpSTbR6euZ813vqEtnJ2fpZ5JcAFxQVWsXORRJ82Q+ayb+C0CSpBayANB0/ga4d7GDkNQX5rOm5SYASZJayBEASZJaaEH/BbBq1aq68sorF/IhJT1RX05sZD5LQ6OnnF7QEYCtW7cu5MNJGiDzWRptbgKQJKmFLAAkSWohCwBJklrIAkCSpBayAJAkqYUsACRJaiELAEmSWqjrAiDJkiQ3Jrmimd4vybokG5OsSbLT4MKUJEn9NJcRgFOBDZOmPwicVVUrgIeAk/sZmCRJGpyuCoAky4FXAuc20wGOAi5pZrkQOHYQAUqSpP7rdgTgbOAdwGPN9DOBh6tqWzO9Cdirz7FJkqQBmbUASPJbwOaqumFy8zSzTnte4SSrk6xPsn7Lli09hilpGJjP0vjoZgTgCOBVSe4FLqIz9H82sGuS7WcTXA7cN93CVXVOVa2sqpUTExN9CFnSYjGfpfExawFQVadX1fKq2hd4LfDFqnodcC1wXDPbicBlA4tSkiT11XyOA/BO4A+T3E1nn4Dz+hOSJEkatKWzz/IzVbUWWNvcvgc4rP8hSZKkQfNIgJIktZAFgCRJLWQBIElSC1kASJLUQhYAkiS1kAWAJEktZAEgSVILWQBIktRCFgCSJLWQBYAkSS1kASBJUgtZAEiS1EIWAJIktZAFgCRJLWQBIElSC1kASJLUQhYAkiS10KwFQJKnJLkuyc1Jbk/y7qZ9vyTrkmxMsibJToMPV5Ik9UM3IwD/DhxVVQcDhwCrkhwOfBA4q6pWAA8BJw8uTEmS1E+zFgDV8UgzuWNzKeAo4JKm/ULg2IFEKEmS+q6rfQCSLElyE7AZuBr4FvBwVW1rZtkE7DWYECVJUr91VQBU1aNVdQiwHDgM2H+62aZbNsnqJOuTrN+yZUvvkUpadOazND7m9C+AqnoYWAscDuyaZGlz13LgvhmWOaeqVlbVyomJifnEKmmRmc/S+OjmXwATSXZtbu8MvAzYAFwLHNfMdiJw2aCClCRJ/bV09llYBlyYZAmdguHiqroiyR3ARUneC9wInDfAOCVJUh/NWgBU1S3AC6Zpv4fO/gCSJGnEeCRASZJayAJAkqQWsgCQJKmFLAAkSWohCwBJklrIAkCSpBayAJAkqYUsACRJaiELAEmSWsgCQJKkFrIAkCSphSwAJElqIQsASZJayAJAkqQWsgCQJKmFLAAkSWohCwBJklpo1gIgyd5Jrk2yIcntSU5t2ndLcnWSjc31MwYfriRJ6oduRgC2AW+rqv2Bw4E3JzkAOA24pqpWANc005IkaQTMWgBU1f1V9c3m9g+BDcBewDHAhc1sFwLHDipISZLUX3PaByDJvsALgHXAnlV1P3SKBGCPfgcnSZIGY2m3MybZBfgc8Jaq+kGSbpdbDawG2GeffXqJUdKQMJ8X31lX39XVfG89+nkDjkSjrqsRgCQ70vny/1RVXdo0P5hkWXP/MmDzdMtW1TlVtbKqVk5MTPQjZkmLxHyWxkc3/wIIcB6woao+POmuy4ETm9snApf1PzxJkjQI3WwCOAJ4A3Brkpuatj8GPgBcnORk4DvA8YMJUZIk9dusBUBVfRWYaYP/S/sbjiRJWggeCVCSpBayAJAkqYUsACRJaiELAEmSWsgCQJKkFrIAkCSphSwAJElqIQsASZJayAJAkqQWsgCQJKmFuj4dsCSpw1Pyahw4AiBJUgtZAEiS1EIWAJIktZAFgCRJLeROgJI0htxRUbOZdQQgyflJNie5bVLbbkmuTrKxuX7GYMOUJEn91M0mgAuAVVPaTgOuqaoVwDXNtCRJGhGzbgKoqi8n2XdK8zHAkc3tC4G1wDv7GJcktUa3w/Wjws0Po6HXnQD3rKr7AZrrPfoXkiRJGrSB/wsgyeok65Os37Jly6AfTtIAmc/S+Oi1AHgwyTKA5nrzTDNW1TlVtbKqVk5MTPT4cJKGgfksjY9eC4DLgROb2ycCl/UnHEmStBBm3QkwyWfo7PC3e5JNwJ8CHwAuTnIy8B3g+EEGKUkLod87443bzn0aL938C+CEGe56aZ9jkSRJC8QjAWrBdfOryL8HScPF0Yzx47kAJElqIQsASZJayE0A6iuHCaXRYs62lyMAkiS1kCMAaj13SpTURo4ASJLUQhYAkiS1kJsAhtxCDU+P4jD4KMasxeGObsOp36+L+T43jgBIktRCFgCSJLWQmwDGwGzDaA6LSZKmcgRAkqQWcgSgB/3a+WzUdkwatXhhYWN2p0RJo8QRAEmSWsgCQJKkFnITwIAM03D5MMXSrWGLedjiGUXdPoduJlGvfI/NzbxGAJKsSnJnkruTnNavoCRJ0mD1PAKQZAnwceBoYBNwfZLLq+qOfgW3nTtXSZrKURmNomEapZjPCMBhwN1VdU9V/Ri4CDimP2FJkqRBmk8BsBfw3UnTm5o2SZI05FJVvS2YHA+8vKpOaabfABxWVf99ynyrgdXN5POBO2dZ9e7A1p6CGk7j1J9x6gu0tz9bq2pVLw/QQz7PJa5RME59AfszzObSl55yej4FwIuAM6vq5c306QBV9f6eVviz9a6vqpXzWccwGaf+jFNfwP4slGGNqxfj1BewP8NsIfoyn00A1wMrkuyXZCfgtcDl/QlLkiQNUs//AqiqbUl+H7gKWAKcX1W39y0ySZI0MPM6EFBVfQH4Qp9i2e6cPq9vsY1Tf8apL2B/FsqwxtWLceoL2J9hNvC+9LwPgCRJGl2eC0CSpBayAJAkqYUsACRJaiELAEmSWsgCQJKkFrIAkCSphSwAJElqIQsASZJayAJAkqQWsgCQJKmFLAAkSWohC4AeJXk0yU1Jbkvy2SRPfZJ5z0zy9oWMb4Y4XpfklubytSQHzzDfBUmOnKZ9zyRXJLk5yR1J+nYiqCTnJjmgD+s5KcnH+rCeQ5PcmuTuJH+eJPNdp4aX+Tz2+fy+JN9N8sh81zVOLAB696OqOqSqDgJ+DLxpsQPqwreB/6eqfhn4M+Z+tqn3AFdX1cFVdQBw2lwWTrJkpvuq6pSqumOO8QzSXwKrgRXNZdXihqMBM5/HO5//FjhssYMYNhYA/fEV4BcBkryxqchvTvLJqTMm+Z0k1zf3f277L40kxze/Pm5O8uWm7cAk1zW/TG5JsmI+QVbV16rqoWbyG8DyOa5iGbBp0vpuaeI8MskVk/r4sSQnNbfvTfKuJF8F3pHkuknz7Ztk+zrWJlmZ5PeS/M9J85yU5KPN7ddPej7+avsHUJL/luSuJF8Cjphjn54gyTLg56vq69U5XeYngGPnu16NDPN5jPK56ds3qur+fqxrnFgAzFOSpcArgFuTHAicARxVVQcDp06zyKVV9avN/RuAk5v2dwEvb9pf1bS9CfhIVR0CrGRSsk56/DVNAk29vHGW0E8G/m6O3f04cF6Sa5OckeTZXS73b1X1kqp6P7BTkuc07a8BLp4y7yXAb0+afg2wJsn+ze0jmufjUeB1zZf1u+l8UBwNTDvsmOTXZ3ievjbN7Hvx+Od6U9OmMWc+d2XU8lkzWLrYAYywnZPc1Nz+CnAe8LvAJVW1FaCqvj/NcgcleS+wK7ALcFXT/g/ABUkuBi5t2r4OnJFkOZ0Pmo1TV1ZVr5lr4El+nc4HxkvmslxVXdUk+yo6H5I3Jjmoi0XXTLp9MfBq4AN0PgAeF39VbUlyT5LDgY3A8+k8N28GDgWuT2dz/M7AZuCFwNqq2tL0bQ3wvGlivxY4pMuuTre9v7pcVqPJfB7ffNYMLAB696Omcv2pdN7Js31RXAAcW1U3N8NqRwJU1ZuSvBB4JXBTkkOq6tNJ1jVtVyU5paq+OOUx19BJqqk+XFWfmNqY5JeBc4FXVNX/7aKfj9N8CH4a+HQzTPhrwIM8fjTpKVMW+5dJt9cAn01yaWd1T/wQbOZ5NfCPwOerqprn9sKqOn1Kf46liy/n5kPyrGnu+teqevGUtk08fjh1OXDfbI+hkWY+j28+ayZV5aWHC/DING0HAncBz2ymd2uuzwTe3tzeCuwB7AhcDVzQtD930npupFPdPgdI03Y28JZ5xrwPcDfw4lnmuwA4cpr2o4CnNrefTmfI81eBvYF7gZ8DfoHOzkknNfPdC+w+ZT3XA58E3jGpbS2wsrn9DOAe4FrgsKbtADq/IPbY/twC/4HOdsx/Ap7ZPKdfAT7Wh9f3euBwOqMBfwf85mK/57wM7mI+j3c+P9nr3OaLIwB9VFW3J3kf8KUkj9JJ/JOmzPYnwDo6b/Jb6SQewIeanYICXAPcTGev3Ncn+QnwAJ29dufjXXQS6y+aYbdtVbVyDssfCnwsyTY6vxDOrarrAZqhzlvoJPWNs6xnDfAhYL/p7qyqh5LcARxQVdc1bXck+R/A3yfZAfgJ8Oaq+kaSM+kMr94PfBOYce/kOfg9Oh+cO9MpAOa6fVUjznwen3xOZ0fE/wo8NckmOn09c77rHXXbq1Hpp5JcQOeXzNpFDkXSPJnPmon/ApAkqYUsADSdv6GzrU/S6DOfNS03AUiS1EKOAEiS1EIWAJIktdCC/g1w1apVdeWVVy7kQ0p6or6c2dB8loZGTzm9oCMAW7duXciHkzRA5rM02twEIElSC1kASJLUQhYAkiS1kAWAJEktZAEgSVILWQBIktRCFgCSJLVQ1wVAkiVJbkxyRTO9X5J1STYmWZNkp8GFKUmS+mkuIwCnAhsmTX8QOKuqVgAPASf3MzBJkjQ4XRUASZYDrwTObaYDHAVc0sxyIXDsIAKUJEn91+0IwNnAO4DHmulnAg9X1bZmehOwV59jkyRJAzJrAZDkt4DNVXXD5OZpZq0Zll+dZH2S9Vu2bOkxTEnDwHyWxkc3IwBHAK9Kci9wEZ2h/7OBXZNsP5vgcuC+6RauqnOqamVVrZyYmOhDyJIWi/ksjY9ZC4CqOr2qllfVvsBrgS9W1euAa4HjmtlOBC4bWJSSJKmv5nMcgHcCf5jkbjr7BJzXn5AkSdKgLZ19lp+pqrXA2ub2PcBh/Q9JkiQNmkcClCSphSwAJElqIQsASZJayAJAkqQWsgCQJKmFLAAkSWohCwBJklrIAkCSpBayAJAkqYUsACRJaiELAEmSWsgCQJKkFrIAkCSphSwAJElqIQsASZJayAJAkqQWmrUASPKUJNcluTnJ7Une3bTvl2Rdko1J1iTZafDhSpKkfuhmBODfgaOq6mDgEGBVksOBDwJnVdUK4CHg5MGFKUmS+mnWAqA6Hmkmd2wuBRwFXNK0XwgcO5AIJUlS33W1D0CSJUluAjYDVwPfAh6uqm3NLJuAvQYToiRJ6reuCoCqerSqDgGWA4cB+08323TLJlmdZH2S9Vu2bOk9UkmLznyWxsec/gVQVQ8Da4HDgV2TLG3uWg7cN8My51TVyqpaOTExMZ9YJS0y81kaH938C2Aiya7N7Z2BlwEbgGuB45rZTgQuG1SQkiSpv5bOPgvLgAuTLKFTMFxcVVckuQO4KMl7gRuB8wYYpyRJ6qNZC4CqugV4wTTt99DZH0CSJI0YjwQoSVILWQBIktRCFgCSJLWQBYAkSS1kASBJUgtZAEiS1EIWAJIktZAFgCRJLWQBIElSC1kASJLUQhYAkiS1kAWAJEktZAEgSVILWQBIktRCFgCSJLWQBYAkSS1kASBJUgvNWgAk2TvJtUk2JLk9yalN+25Jrk6ysbl+xuDDlSRJ/dDNCMA24G1VtT9wOPDmJAcApwHXVNUK4JpmWpIkjYCls81QVfcD9ze3f5hkA7AXcAxwZDPbhcBa4J0DiVKSJD2pG264YY+lS5eeCxzE43/gPwbctm3btlMOPfTQzdsbZy0AJkuyL/ACYB2wZ1McUFX3J9ljnrFLkqQeLV269NxnPetZ+09MTDy0ww471Pb2xx57LFu2bDnggQceOBd41fb2rncCTLIL8DngLVX1gzkstzrJ+iTrt2zZ0u1ikoaQ+SwNtYMmJiZ+MPnLH2CHHXaoiYmJf6YzMvCz9m7WmGRHOl/+n6qqS5vmB5Msa+5fBmyebtmqOqeqVlbVyomJiTn2RdIwMZ+lobbD1C//SXcUU77zu/kXQIDzgA1V9eFJd10OnNjcPhG4rKdwJUnSgutmH4AjgDcAtya5qWn7Y+ADwMVJTga+Axw/mBAlSVK/dfMvgK8CmeHul/Y3HEmS1KPHHnvssUy3GeCxxx4LnX8D/JRHApQkaTzctmXLll9ovux/qvkXwC8At01un9PfACVJ0nDatm3bKQ888MC5DzzwwIzHAZg8vwWAJEljoDnIz6tmnbHhJgBJklrIAkCSpBayAJAkqYUsACRJaiELAEmSWsgCQJKkFrIAkCSphSwAJElqIQsASZJayAJAkqQWsgCQJKmFLAAkSWohCwBJklrIAkCSpBaatQBIcn6SzUlum9S2W5Krk2xsrp8x2DAlSVI/Le1inguAjwGfmNR2GnBNVX0gyWnN9Dv7H54Azrr6rhnve+vRz1vASCRJ42LWEYCq+jLw/SnNxwAXNrcvBI7tc1ySJGmAet0HYM+quh+gud6jfyFJkqRB62YTwLwkWQ2sBthnn30G/XBDbRBD+W4e0ELqNZ+f7H0KvldnY55rEHodAXgwyTKA5nrzTDNW1TlVtbKqVk5MTPT4cJKGgfksjY9eRwAuB04EPtBcX9a3iCRpxDjCoVHUzd8APwN8HXh+kk1JTqbzxX90ko3A0c20JEkaEbOOAFTVCTPc9dI+xyJJkhbIwHcC1HBypyJpeMy2CUEaBA8FLElSCzkCMCQG8QvAXxVSdwa9E5+5qGHkCIAkSS1kASBJUgu5CaAHDudJkkadIwCSJLWQBYAkSS1kASBJUgtZAEiS1ELuBKgn8CiBWmieTKd3833ufO7byxEASZJayAJAkqQWchOA+qbX4yP0OsS40I+nxbPYw9SjfOyPxY59sV87zcwRAEmSWsgRAM2JJy3SKPI91rvFPlGSIwSDM68RgCSrktyZ5O4kp/UrKEmSNFg9FwBJlgAfB14BHACckOSAfgUmSZIGZz6bAA4D7q6qewCSXAQcA9zRj8CkQen1OAfudCg90WJvXnETQu/mswlgL+C7k6Y3NW2SJGnIpap6WzA5Hnh5VZ3STL8BOKyq/vuU+VYDq5vJ5wN3zrLq3YGtPQU1nMapP+PUF2hvf7ZW1apeHqCHfJ5LXKNgnPoC9meYzaUvPeX0fAqAFwFnVtXLm+nTAarq/T2t8GfrXV9VK+ezjmEyTv0Zp76A/VkowxpXL8apL2B/htlC9GU+mwCuB1Yk2S/JTsBrgcv7E5YkSRqknncCrKptSX4fuApYApxfVbf3LTJJkjQw8zoQUFV9AfhCn2LZ7pw+r2+xjVN/xqkvYH8WyrDG1Ytx6gvYn2E28L70vA+AJEkaXZ4LQJKkFrIAkCSphSwAJElqIQsASZJayAJAkqQWsgCQJKmFLAAkSWohCwBJklrIAkCSpBayAJAkqYUsACRJaiELAEmSWsgCoEdJHk1yU5Lbknw2yVOfZN4zk7x9IeObIY5jktzSxL0+yUtmmG9tkn2naX9+c99NSTYk6dvZqpJ8IcmufVhPX57rJKuS3Jnk7iSnzXd9Gm7m89jn8/lJNie5bb7rGicWAL37UVUdUlUHAT8G3rTYAXXhGuDgqjoE+H+Bc+e4/J8DZzX93h/46FwWTrJkpvuq6jer6uE5xjMQTZwfB14BHACckOSAxY1KA2Y+j2k+Ny4AVi12EMPGAqA/vgL8IkCSNzZV+c1JPjl1xiS/k+T65v7Pbf+lkeT45tfHzUm+3LQdmOS6pkK/JcmK+QRZVY/Uz87//DRgrueCXgZsmrS+W5s4T0rysUl9vCLJkc3tR5K8J8k64I+TXDxpviOT/G1z+94kuyf5YJL/b9I8ZyZ5W3P7j5rn7pYk7540zxnNr/X/Azx/jn2azmHA3VV1T1X9GLgIOKYP69VoMJ/HK5+pqi8D3+/HusbJ0sUOYNQlWUrnl+KVSQ4EzgCOqKqtSXabZpFLq+p/N8u+FziZTuX9LuDlVfW9SUNnbwI+UlWfSrIT8ISKO8kapk+SD1fVJ6aZ/z8D7wf2AF45x+6eBXwxydeAvwf+uosq/2nAbVX1rua5uifJ06rqX4DXAGumzH8RcDbwF830q4FVSX4DWEHnyznA5Ul+DfgX4LXAC+i8n78J3DA1iCSvA/5omvjurqrjprTtBXx30vQm4IWz9FNjwHwey3zWDCwAerdzkpua218BzgN+F7ikqrYCVNV0FedBzQfFrsAuwFVN+z8AFzQV9aVN29eBM5Isp/NBs3HqyqrqNXMJuqo+D3y+SbY/A142h2X/OslVdIbSjgF+N8nBsyz2KPC5ZvltSa4E/lOSS+h8YL1jymPcmGSPJM8GJoCHquo7Sf4A+A3gxmbWXeh8gDwd+HxV/StAkstniP1TwKe67GqmW0WXy2o0mc/jm8+agQVA737UbHv7qSRh9i+KC4Bjq+rmJCcBRwJU1ZuSvJBOEt2U5JCq+nQz1PZK4Kokp1TVF6c85px+MWxXVV9O8twku2//gOtGVd0HnA+cn84ONQcB23j85qSnTLr9b1X16KTpNcCb6QzHXV9VP5zmYS4BjgOeRecXBHS+lN9fVX81ecYkb6GLL+c5/mLYBOw9aXo5cN9sj6GRZj6Pbz5rJlXlpYcL8Mg0bQcCdwHPbKZ3a67PBN7e3N5KZ7huR+Bq4IKm/bmT1nMjcAjwHCBN29nAW+YZ8y9OWt+vAN/bPj1lvrXAvtO0rwJ2bG4/C7i/uX4J8DU6Hxp7Az8AjpzueaIz7Hkv8Fng1ZPa7wV2n/Q8fq15Lpc1bb8BrAN2aab3ap7HXwFuAXam8+th4/bneh7P01LgHmA/YCfgZuDAxX7PeRncxXwe33yeFNO+dDZfLPr7bVgujgD0UVXdnuR9wJeSPEon8U+aMtuf0Hnj/xNwK503OcCHmp2CQmfv3puB04DXJ/kJ8ADwnnmG+F+ANzbr+xHwmmoyo0u/AXwkyb81039UVQ8keRD4dtOf2+hst5tWVT2a5Ao6z8uJM8xze5KnA9+rqvubtr9Psj/w9c4PMx4BXl9V32x+Nd1E5zn9yhz6M1OM25L8Pp3h3CXA+VV1+3zXq9FiPo9HPgMk+Qyd0Zndk2wC/rSqzuvHukdm0L/CAAAM+0lEQVRZ5vZ+URskWQucVFX3LnIokubJfNZM/BugJEktZAGg6VwADNNBPCT17gLMZ03DTQCSJLWQIwCSJLXQgv4LYNWqVXXllVcu5ENKeqLpDnQ0Z+azNDR6yukFHQHYurXr41NIGnLmszTa3AQgSVILWQBIktRCFgCSJLWQBYAkSS3kuQAG5Kyr75p1nrce/bwFiESSpCdyBECSpBayAJAkqYW6LgCSLElyY3PqR5Lsl2Rdko1J1iTZaXBhSpKkfprLCMCpwIZJ0x8EzqqqFcBDwMn9DEySJA1OVwVAkuXAK4Fzm+kARwGXNLNcCBw7iAAlSVL/dTsCcDbwDuCxZvqZwMNVta2Z3gTs1efYJEnSgMxaACT5LWBzVd0wuXmaWac9r3CS1UnWJ1m/ZcuWHsOUNAzMZ2l8dDMCcATwqiT3AhfRGfo/G9g1yfbjCCwH7ptu4ao6p6pWVtXKiYmJPoQsabGYz9L4mLUAqKrTq2p5Ve0LvBb4YlW9DrgWOK6Z7UTgsoFFKUmS+mo+RwJ8J3BRkvcCNwLn9Sek4dbNEf4kSRp2cyoAqmotsLa5fQ9wWP9DkiRJg+aRACVJaiELAEmSWsgCQJKkFrIAkCSphSwAJElqIQsASZJaaD7HAdA8dXtMgbce/bwBRyJJahtHACRJaiELAEmSWsgCQJKkFrIAkCSphSwAJElqIQsASZJayAJAkqQWsgCQJKmFLAAkSWohjwQ4Aro5YqBHC5QkzcWsIwBJnpLkuiQ3J7k9ybub9v2SrEuyMcmaJDsNPlxJktQP3WwC+HfgqKo6GDgEWJXkcOCDwFlVtQJ4CDh5cGFKkqR+mrUAqI5Hmskdm0sBRwGXNO0XAscOJEJJktR3Xe0EmGRJkpuAzcDVwLeAh6tqWzPLJmCvwYQoSZL6rasCoKoerapDgOXAYcD+08023bJJVidZn2T9li1beo9U0qIzn6XxMae/AVbVw8Ba4HBg1yTb/0WwHLhvhmXOqaqVVbVyYmJiPrFKWmTmszQ+uvkXwESSXZvbOwMvAzYA1wLHNbOdCFw2qCAlSVJ/dXMcgGXAhUmW0CkYLq6qK5LcAVyU5L3AjcB5A4xTkiT10awFQFXdArxgmvZ76OwPIEmSRoyHApYkqYUsACRJaiELAEmSWsgCQJKkFrIAkCSphSwAJElqIQsASZJayAJAkqQWsgCQJKmFLAAkSWohCwBJklrIAkCSpBayAJAkqYUsACRJaiELAEmSWsgCQJKkFrIAkCSphWYtAJLsneTaJBuS3J7k1KZ9tyRXJ9nYXD9j8OFKkqR+6GYEYBvwtqraHzgceHOSA4DTgGuqagVwTTMtSZJGwKwFQFXdX1XfbG7/ENgA7AUcA1zYzHYhcOyggpQkSf01p30AkuwLvABYB+xZVfdDp0gA9uh3cJIkaTCWdjtjkl2AzwFvqaofJOl2udXAaoB99tmnlxjVhbOuvqur+d569PMGHInGmfksjY+uRgCS7Ejny/9TVXVp0/xgkmXN/cuAzdMtW1XnVNXKqlo5MTHRj5glLRLzWRofs44ApPNT/zxgQ1V9eNJdlwMnAh9ori8bSIRacN2MJjiSIEmjrZtNAEcAbwBuTXJT0/bHdL74L05yMvAd4PjBhChJkvpt1gKgqr4KzLTB/6X9DUeSJC0EjwQoSVILWQBIktRCXf8NUOOh278LSpLGmyMAkiS1kAWAJEktZAEgSVILWQBIktRCFgCSJLWQBYAkSS1kASBJUgtZAEiS1EIWAJIktZAFgCRJLWQBIElSC1kASJLUQkN9MqBuTlzz1qOftwCRSJI0XmYdAUhyfpLNSW6b1LZbkquTbGyunzHYMCVJUj91swngAmDVlLbTgGuqagVwTTMtSZJGxKybAKrqy0n2ndJ8DHBkc/tCYC3wzj7G1VfdbEoANydIktqj150A96yq+wGa6z36F5IkSRq0ge8EmGQ1sBpgn332GfTDaYF0O6rSDUdeRkdb83m29/ts7+H5Li8NQq8jAA8mWQbQXG+eacaqOqeqVlbVyomJiR4fTtIwMJ+l8dFrAXA5cGJz+0Tgsv6EI0mSFsKsmwCSfIbODn+7J9kE/CnwAeDiJCcD3wGOH2SQkkabQ+BPzudHi6GbfwGcMMNdL+1zLJIkaYEM9ZEAJbXDoH8B93OnVWlceC4ASZJayAJAkqQWchOAJM2Tmxg0ihwBkCSphRwBkKQh56nRNQiOAEiS1EIWAJIktdDIbwLo58437sizODxdsyQtPEcAJElqIQsASZJayAJAkqQWsgCQJKmFLAAkSWohCwBJklrIAkCSpBYa+eMASKPAQ7nOz2zPn8/d/I9j4nPYPvMaAUiyKsmdSe5Oclq/gpIkSYPV8whAkiXAx4GjgU3A9Ukur6o7+hWcNNkwHqnRX03DYRjfG6Nm1EcQHCWau/mMABwG3F1V91TVj4GLgGP6E5YkSRqk+RQAewHfnTS9qWmTJElDbj47AWaatnrCTMlqYHUz+UiSO2dZ7+7A1nnENWzGqT/j1BfoQ3/+sE+B9Gld3fbnyqpa1csD9JDPc4lrFIxTX6CP/elnLszDjP0ZkvjmYi6vTU85naonfGd3t2DyIuDMqnp5M306QFW9v6cV/my966tq5XzWMUzGqT/j1BewPwtlWOPqxTj1BezPMFuIvsxnE8D1wIok+yXZCXgtcHl/wpIkSYPU8yaAqtqW5PeBq4AlwPlVdXvfIpMkSQMzrwMBVdUXgC/0KZbtzunz+hbbOPVnnPoC9mehDGtcvRinvoD9GWYD70vP+wBIkqTR5bkAJElqoaEqAEb50MJJ9k5ybZINSW5PcmrTvluSq5NsbK6fsdixzkWSJUluTHJFM71fknVNf9Y0O4COhCS7JrkkyT82r9OLRvX1SfLW5n12W5LPJHnKsL02o5zPMJ45bT4Pr8XI6aEpACYdWvgVwAHACUkOWNyo5mQb8Laq2h84HHhzE/9pwDVVtQK4ppkeJacCGyZNfxA4q+nPQ8DJixJVbz5C5/+yvwQcTKdfI/f6JNkL+ANgZVUdRGcn3NcyRK/NGOQzjGdOm89DaNFyuqqG4gK8CLhq0vTpwOmLHdc8+nMZnfMk3Aksa9qWAXcudmxz6MNyOkl0FHAFnYM/bQWWTveaDfMF+Hng2zT7vUxqH7nXh58dhXM3OjvyXgG8fJhem3HL56YPI53T5vPwXhYrp4dmBIAxOrRwkn2BFwDrgD2r6n6A5nqPxYtszs4G3gE81kw/E3i4qrY106P0Gj0H2AL8dTMEem6SpzGCr09VfQ/4X8B3gPuBfwZuYLhem7HJZxibnDafh9Ri5fQwFQBdHVp42CXZBfgc8Jaq+sFix9OrJL8FbK6qGyY3TzPrqLxGS4FfAf6yql4A/AsjMjw4VbNd8xhgP+DZwNPoDLVPtZivzSi/Vx5nHHLafB5ui5XTw1QAbAL2njS9HLhvkWLpSZId6XxQfKqqLm2aH0yyrLl/GbB5seKboyOAVyW5l86ZHo+i8wti1yTbjx8xSq/RJmBTVa1rpi+h8wEyiq/Py4BvV9WWqvoJcCnwYobrtRn5fIaxymnzebgtSk4PUwEw0ocWThLgPGBDVX140l2XAyc2t0+ksx1x6FXV6VW1vKr2pfNafLGqXgdcCxzXzDZK/XkA+G6S5zdNLwXuYDRfn+8Ahyd5avO+296XYXptRjqfYbxy2nweeouT04u988OUHSF+E7gL+BZwxmLHM8fYX0JneOYW4Kbm8pt0trNdA2xsrndb7Fh76NuRwBXN7ecA1wF3A58Ffm6x45tDPw4B1jev0d8AzxjV1wd4N/CPwG3AJ4GfG7bXZpTzuYl/LHPafB7Oy2LktEcClCSphYZpE4AkSVogFgCSJLWQBYAkSS1kASBJUgtZAEiS1EIWAHqcJP85SSX5pcWORdL8mdOaiQWApjoB+Cqdg4VIGn3mtKZlAaCfao55fgSdU06+tmnbIclfNOepviLJF5Ic19x3aJIvJbkhyVXbD8EpaTiY03oyFgCa7Fg659e+C/h+kl8BfhvYF/iPwCl0Tkm5/RjpHwWOq6pDgfOB9y1G0JJmZE5rRktnn0UtcgKdE4RA54QhJwA7Ap+tqseAB5Jc29z/fOAg4OrOoatZQuc0lpKGhzmtGVkACIAkz6RzhrCDkhSd5C/g8zMtAtxeVS9aoBAlzYE5rdm4CUDbHQd8oqr+Q1XtW1V7A98GtgL/pdluuCedE4kA3AlMJPnp8GGSAxcjcEnTMqf1pCwAtN0JPPGXweeAZ9M59/ZtwF8B64B/rqof0/mA+WCSm+mcKe3FCxeupFmY03pSng1Qs0qyS1U90gwpXgccUZ3zcUsaQea0wH0A1J0rkuwK7AT8mR8U0sgzp+UIgCRJbeQ+AJIktZAFgCRJLWQBIElSC1kASJLUQhYAkiS1kAWAJEkt9P8DSXiXnwvpi2UAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 514.88x475.2 with 6 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# aspect: 宽高比  width = size * aspect , size : height\n",
    "grid = sns.FacetGrid(train_df, col='Survived', row='Pclass', size=2.2, aspect=1.6)\n",
    "# alpha: 透明度\n",
    "grid.map(plt.hist, 'Age', alpha=.5, bins=20)\n",
    "grid.add_legend();"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###  关联类别特征\n",
    "\n",
    "**观察**\n",
    "\n",
    "- 女性乘客更容易存活\n",
    "- Embarke = C 时男性有更高的成活率。这可能是Pclass和Embarked之间的相关性，反过来是Pclass和Survived，不一定是Embarked和Survived之间的直接相关。\n",
    "- Pclass = 3 时，不同 Embarked 的男性成活率不同\n",
    "\n",
    "**决策**\n",
    "\n",
    "- 增加 Sex 到模型训练中\n",
    "- 补全并增加 Embarked 特征到模型训练中"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-15T16:00:37.380259Z",
     "start_time": "2019-08-15T16:00:37.376299Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on function pointplot in module seaborn.categorical:\n",
      "\n",
      "pointplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, estimator=<function mean at 0x000001C164992158>, ci=95, n_boot=1000, units=None, markers='o', linestyles='-', dodge=False, join=True, scale=1, orient=None, color=None, palette=None, errwidth=None, capsize=None, ax=None, **kwargs)\n",
      "    Show point estimates and confidence intervals using scatter plot glyphs.\n",
      "    \n",
      "    A point plot represents an estimate of central tendency for a numeric\n",
      "    variable by the position of scatter plot points and provides some\n",
      "    indication of the uncertainty around that estimate using error bars.\n",
      "    \n",
      "    Point plots can be more useful than bar plots for focusing comparisons\n",
      "    between different levels of one or more categorical variables. They are\n",
      "    particularly adept at showing interactions: how the relationship between\n",
      "    levels of one categorical variable changes across levels of a second\n",
      "    categorical variable. The lines that join each point from the same ``hue``\n",
      "    level allow interactions to be judged by differences in slope, which is\n",
      "    easier for the eyes than comparing the heights of several groups of points\n",
      "    or bars.\n",
      "    \n",
      "    It is important to keep in mind that a point plot shows only the mean (or\n",
      "    other estimator) value, but in many cases it may be more informative to\n",
      "    show the distribution of values at each level of the categorical variables.\n",
      "    In that case, other approaches such as a box or violin plot may be more\n",
      "    appropriate.\n",
      "    \n",
      "    Input data can be passed in a variety of formats, including:\n",
      "    \n",
      "    - Vectors of data represented as lists, numpy arrays, or pandas Series\n",
      "      objects passed directly to the ``x``, ``y``, and/or ``hue`` parameters.\n",
      "    - A \"long-form\" DataFrame, in which case the ``x``, ``y``, and ``hue``\n",
      "      variables will determine how the data are plotted.\n",
      "    - A \"wide-form\" DataFrame, such that each numeric column will be plotted.\n",
      "    - Anything accepted by ``plt.boxplot`` (e.g. a 2d array or list of vectors)\n",
      "    \n",
      "    In most cases, it is possible to use numpy or Python objects, but pandas\n",
      "    objects are preferable because the associated names will be used to\n",
      "    annotate the axes. Additionally, you can use Categorical types for the\n",
      "    grouping variables to control the order of plot elements.    \n",
      "    \n",
      "    Parameters\n",
      "    ----------\n",
      "    x, y, hue : names of variables in ``data`` or vector data, optional\n",
      "        Inputs for plotting long-form data. See examples for interpretation.        \n",
      "    data : DataFrame, array, or list of arrays, optional\n",
      "        Dataset for plotting. If ``x`` and ``y`` are absent, this is\n",
      "        interpreted as wide-form. Otherwise it is expected to be long-form.    \n",
      "    order, hue_order : lists of strings, optional\n",
      "        Order to plot the categorical levels in, otherwise the levels are\n",
      "        inferred from the data objects.        \n",
      "    estimator : callable that maps vector -> scalar, optional\n",
      "        Statistical function to estimate within each categorical bin.\n",
      "    ci : float or \"sd\" or None, optional\n",
      "        Size of confidence intervals to draw around estimated values.  If\n",
      "        \"sd\", skip bootstrapping and draw the standard deviation of the\n",
      "        observations. If ``None``, no bootstrapping will be performed, and\n",
      "        error bars will not be drawn.\n",
      "    n_boot : int, optional\n",
      "        Number of bootstrap iterations to use when computing confidence\n",
      "        intervals.\n",
      "    units : name of variable in ``data`` or vector data, optional\n",
      "        Identifier of sampling units, which will be used to perform a\n",
      "        multilevel bootstrap and account for repeated measures design.    \n",
      "    markers : string or list of strings, optional\n",
      "        Markers to use for each of the ``hue`` levels.\n",
      "    linestyles : string or list of strings, optional\n",
      "        Line styles to use for each of the ``hue`` levels.\n",
      "    dodge : bool or float, optional\n",
      "        Amount to separate the points for each level of the ``hue`` variable\n",
      "        along the categorical axis.\n",
      "    join : bool, optional\n",
      "        If ``True``, lines will be drawn between point estimates at the same\n",
      "        ``hue`` level.\n",
      "    scale : float, optional\n",
      "        Scale factor for the plot elements.\n",
      "    orient : \"v\" | \"h\", optional\n",
      "        Orientation of the plot (vertical or horizontal). This is usually\n",
      "        inferred from the dtype of the input variables, but can be used to\n",
      "        specify when the \"categorical\" variable is a numeric or when plotting\n",
      "        wide-form data.    \n",
      "    color : matplotlib color, optional\n",
      "        Color for all of the elements, or seed for a gradient palette.\n",
      "    \n",
      "    palette : palette name, list, or dict, optional\n",
      "        Colors to use for the different levels of the ``hue`` variable. Should\n",
      "        be something that can be interpreted by :func:`color_palette`, or a\n",
      "        dictionary mapping hue levels to matplotlib colors.    \n",
      "    errwidth : float, optional\n",
      "        Thickness of error bar lines (and caps).         \n",
      "    capsize : float, optional\n",
      "        Width of the \"caps\" on error bars.\n",
      "    \n",
      "    ax : matplotlib Axes, optional\n",
      "        Axes object to draw the plot onto, otherwise uses the current Axes.    \n",
      "    \n",
      "    Returns\n",
      "    -------\n",
      "    ax : matplotlib Axes\n",
      "        Returns the Axes object with the boxplot drawn onto it.    \n",
      "    \n",
      "    See Also\n",
      "    --------\n",
      "    barplot : Show point estimates and confidence intervals using bars.    \n",
      "    factorplot : Combine categorical plots and a class:`FacetGrid`.    \n",
      "    \n",
      "    Examples\n",
      "    --------\n",
      "    \n",
      "    Draw a set of vertical point plots grouped by a categorical variable:\n",
      "    \n",
      "    .. plot::\n",
      "        :context: close-figs\n",
      "    \n",
      "        >>> import seaborn as sns\n",
      "        >>> sns.set_style(\"darkgrid\")\n",
      "        >>> tips = sns.load_dataset(\"tips\")\n",
      "        >>> ax = sns.pointplot(x=\"time\", y=\"total_bill\", data=tips)\n",
      "    \n",
      "    Draw a set of vertical points with nested grouping by a two variables:\n",
      "    \n",
      "    .. plot::\n",
      "        :context: close-figs\n",
      "    \n",
      "        >>> ax = sns.pointplot(x=\"time\", y=\"total_bill\", hue=\"smoker\",\n",
      "        ...                    data=tips)\n",
      "    \n",
      "    Separate the points for different hue levels along the categorical axis:\n",
      "    \n",
      "    .. plot::\n",
      "        :context: close-figs\n",
      "    \n",
      "        >>> ax = sns.pointplot(x=\"time\", y=\"total_bill\", hue=\"smoker\",\n",
      "        ...                    data=tips, dodge=True)\n",
      "    \n",
      "    Use a different marker and line style for the hue levels:\n",
      "    \n",
      "    .. plot::\n",
      "        :context: close-figs\n",
      "    \n",
      "        >>> ax = sns.pointplot(x=\"time\", y=\"total_bill\", hue=\"smoker\",\n",
      "        ...                    data=tips,\n",
      "        ...                    markers=[\"o\", \"x\"],\n",
      "        ...                    linestyles=[\"-\", \"--\"])\n",
      "    \n",
      "    Draw a set of horizontal points:\n",
      "    \n",
      "    .. plot::\n",
      "        :context: close-figs\n",
      "    \n",
      "        >>> ax = sns.pointplot(x=\"tip\", y=\"day\", data=tips)\n",
      "    \n",
      "    Don't draw a line connecting each point:\n",
      "    \n",
      "    .. plot::\n",
      "        :context: close-figs\n",
      "    \n",
      "        >>> ax = sns.pointplot(x=\"tip\", y=\"day\", data=tips, join=False)\n",
      "    \n",
      "    Use a different color for a single-layer plot:\n",
      "    \n",
      "    .. plot::\n",
      "        :context: close-figs\n",
      "    \n",
      "        >>> ax = sns.pointplot(\"time\", y=\"total_bill\", data=tips,\n",
      "        ...                    color=\"#bb3f3f\")\n",
      "    \n",
      "    Use a different color palette for the points:\n",
      "    \n",
      "    .. plot::\n",
      "        :context: close-figs\n",
      "    \n",
      "        >>> ax = sns.pointplot(x=\"time\", y=\"total_bill\", hue=\"smoker\",\n",
      "        ...                    data=tips, palette=\"Set2\")\n",
      "    \n",
      "    Control point order by passing an explicit order:\n",
      "    \n",
      "    .. plot::\n",
      "        :context: close-figs\n",
      "    \n",
      "        >>> ax = sns.pointplot(x=\"time\", y=\"tip\", data=tips,\n",
      "        ...                    order=[\"Dinner\", \"Lunch\"])\n",
      "    \n",
      "    Use median as the estimate of central tendency:\n",
      "    \n",
      "    .. plot::\n",
      "        :context: close-figs\n",
      "    \n",
      "        >>> from numpy import median\n",
      "        >>> ax = sns.pointplot(x=\"day\", y=\"tip\", data=tips, estimator=median)\n",
      "    \n",
      "    Show the standard error of the mean with the error bars:\n",
      "    \n",
      "    .. plot::\n",
      "        :context: close-figs\n",
      "    \n",
      "        >>> ax = sns.pointplot(x=\"day\", y=\"tip\", data=tips, ci=68)\n",
      "    \n",
      "    Show standard deviation of observations instead of a confidence interval:\n",
      "    \n",
      "    .. plot::\n",
      "        :context: close-figs\n",
      "    \n",
      "        >>> ax = sns.pointplot(x=\"day\", y=\"tip\", data=tips, ci=\"sd\")\n",
      "    \n",
      "    Add \"caps\" to the error bars:\n",
      "    \n",
      "    .. plot::\n",
      "        :context: close-figs\n",
      "    \n",
      "        >>> ax = sns.pointplot(x=\"day\", y=\"tip\", data=tips, capsize=.2)\n",
      "    \n",
      "    Use :func:`factorplot` to combine a :func:`barplot` and a\n",
      "    :class:`FacetGrid`. This allows grouping within additional categorical\n",
      "    variables. Using :func:`factorplot` is safer than using :class:`FacetGrid`\n",
      "    directly, as it ensures synchronization of variable order across facets:\n",
      "    \n",
      "    .. plot::\n",
      "        :context: close-figs\n",
      "    \n",
      "        >>> g = sns.factorplot(x=\"sex\", y=\"total_bill\",\n",
      "        ...                    hue=\"smoker\", col=\"time\",\n",
      "        ...                    data=tips, kind=\"point\",\n",
      "        ...                    dodge=True,\n",
      "        ...                    size=4, aspect=.7);\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(sns.pointplot)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-15T16:05:35.225760Z",
     "start_time": "2019-08-15T16:05:34.686170Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\APP\\Program\\Anaconda3\\lib\\site-packages\\seaborn\\axisgrid.py:703: UserWarning: Using the pointplot function without specifying `order` is likely to produce an incorrect plot.\n",
      "  warnings.warn(warning)\n",
      "D:\\APP\\Program\\Anaconda3\\lib\\site-packages\\seaborn\\axisgrid.py:708: UserWarning: Using the pointplot function without specifying `hue_order` is likely to produce an incorrect plot.\n",
      "  warnings.warn(warning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<seaborn.axisgrid.FacetGrid at 0x1c16aa20c88>"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 323.94x475.2 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "grid = sns.FacetGrid(train_df, row='Embarked', size = 2.2, aspect=1.6)\n",
    "\n",
    "# sns.pointplot(x, y, hue)  'Pclass', 'Survived', 'Sex'\n",
    "grid.map(sns.pointplot, 'Pclass', 'Survived', 'Sex', palette='deep')\n",
    "grid.add_legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 关联类别和数值特征\n",
    "\n",
    "Embarked，Sex，Fare\n",
    "\n",
    "**观察**\n",
    "\n",
    "- 船票高的乘客存活率高\n",
    "- Embarked 与幸存相关\n",
    "\n",
    "**决策**\n",
    "\n",
    "- 考虑将 Fare 特征分段"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-15T16:21:07.791135Z",
     "start_time": "2019-08-15T16:21:07.377242Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\APP\\Program\\Anaconda3\\lib\\site-packages\\seaborn\\axisgrid.py:703: UserWarning: Using the barplot function without specifying `order` is likely to produce an incorrect plot.\n",
      "  warnings.warn(warning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<seaborn.axisgrid.FacetGrid at 0x1c16a912908>"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgAAAAHUCAYAAABMP5BeAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3Xu8JHV95//XG0bCTeTiAUeQBZVgWFSECUIwBoElkKiwEYOsGnBxR/fnLaIPxegqJl7zSyS6GgMBZZKwAqIIMS6XHwETvADDneEiE0AY5XJIQEBFHObz+6NrpDnTM9Nn5lT3nKnX8/E4j9NVXd+qT3efb593f6u6KlWFJEnqlg3GXYAkSRo9A4AkSR1kAJAkqYMMAJIkdZABQJKkDjIASJLUQQYASZI6yACwFpI8keTavp/jp9F2/yTfXMvtX5pk3hq2XevtN+t5ZZJrklyX5KYkbxmwzE5JLl1J+/+e5IYk1ye5Mclha1tTs955ST43Q+u6M8kz13IdSfK5JIubx7rnTNSm6bHP2mensY4XJPlekl8kee9M1LWumTPuAma5n1fVHuPYcJINx7HdKTU8DTgZ2LuqliT5NWCnabTfAfggsGdV/STJ5sDENNrPqaqlg+6rqoXAwmHXNQKHArs0Py8Fvtj81mjZZ+2zw/oP4J3A4eMupC2OALSgSZ+faNLjwiR7Jrkgyb8leWvfolskOadJ4X+TZIOm/RebdouSfHTKej+c5DLgtX3zN0iyIMnHmumDm21fneSrTSclySFJbmna/8EMPNSn0wuR/w5QVb+oqlun0X5b4BHg0ab9o1V1R1Prrz4pJXlmkjub28c0j+kfgQuTnJnk95avMMlpSV6z/NNS89zcmWTLvmUWJ9kuyUSSryW5svnZr7l/myQXNp+STgKy5k/RrxwG/F31fB/YMsncGVivZoB9dmid6bNVdX9VXQn8cm3Xta4yAKydTfLU4cQj++67u6r2Bf4VOA04AtgH+NO+ZfYG3gO8EHgeT3bwD1bVPOBFwO8keVFfm8eq6mVVdUYzPQc4HfhBVX0ovWGvDwEHVdWe9BL1cUk2Bv4WeBXw28CzBj2gJLtOeUz9P1v2L1tV/wGcB/wwyVeSvH75G+KQrgPuA+5I8uUkrxqy3b7A0VV1AHAGcGRT+0bAgcC3+mpcBpwL/NdmmZcCd1bVfcBngROr6jeB1wCnNM0+AlxWVS9pHt+Og4po3sgGPU9/NGDx7YG7+6aXNPM0WvZZ++ywfXa95y6AtbOq4cTzmt83AJtX1SPAI0ke6+uUV1TV7QBJvgK8DDgb+MMk8+m9PnOB3YDrmzZnTtnOScBZVfXxZnqfZvnvJAHYCPge8ALgjqq6rdnePwDzpxbdfBoYeoi0qt6c5IXAQcB7gf8CHDNk2yeSHAL8Jr03gROT7FVVJ6ym6UXNGxnA/wU+l95Q5iHAv1TVz5vHvtyZwIeBLwOv48nn8CBgt75lt0jydODlNG/sVfVPSR5cSf1HDpq/EoM+kXghjtGzz9pn1TAAtOcXze9lfbeXTy9/3qf+A6gkO9PrlL9ZVQ8mOQ3YuG+Zn05p813gFUn+sqoeo/eP5qKqOqp/oSR7DNjeCpLsyopvWMvtX1UPTZ1ZVTcANyT5e+AOhnwzadoWcAVwRZKL6HX4E4ClPDlCtfGUZj/ta/9Yegcr/S69TxVfGbCZ7wHPTzJBb3/ex5r5GwD7VtXP+xdu3lyGea7OBHYdcNdnqurvpsxbAjynb3oH4Mer24ZGyj47hA712fWeuwDGa+8kOzdDcEcClwFb0OssP0myHb2Dx1blVHrDZ19NMgf4PrBfkucDJNk0ya8DtwA7J3le0+6oQSurqlurao+V/DzljSTJ5kn275u1B/DDYR98kmfnqUfD97e/E9iruX3EalZ1BvAmesOkFwx4TAWcA3wGuLmq/r2560Lg7X31LP8U9S/A65t5hwJbDdpoVR25kudp0BvJecAfpWcf4CdVdc9qHpfWPfbZ7vTZ9Z4jAGtnkyTX9k2fX1VDf62IXsr9FL39if8CnFNVy5JcAywCbge+s7qVVNVnkjwD+Ht6neAY4CvNEBvAh6rqB80Q5T8leYDeG9fu06h1kADvS++gm5/TexM8Zhrtnwb8RZJnA48Bk8DyA67+AjgryRuBf17Nei4E/g44r6oeX8kyZwJXTqnvncAXklxPry/8S7P9j9J7/q4Gvg3cNY3HtDLfAn4PWAz8jN6bn0bPPmufHUqSZ9E7HmMLYFmSPwZ2q6qH13bd64r0gpbUniQ7AadV1f7jrUTSMOyz3eAuAEmSOsgAoFF4iN7XqiTNDvbZDnAXgCRJHeQIgCRJHTQrvgVwyCGH1Pnnnz/uMqQumInTHttnpdFZ4z47K0YAHnjggXGXIGka7LPSum9WBABJkjSzDACSJHWQAUCSpA4yAEiS1EGtBoAk706yKMmN6V17euPmQhqXJ7ktvWszb9RmDZIkaUWtBYAk29O7cMO8qtod2JDedZ0/DZxYVbsADwLHtlWDJEkarO1dAHPoXX1rDrApcA9wAHB2c/8Cetd6liRJI9RaAKiqH9G7PORd9P7x/wS4CnioqpY2iy0Btm+rBkmSNFibuwC2Ag4DdgaeDWwGHDpg0YEXI0gyP8nCJAsnJyfbKlPSDLHPSrNLm7sADgLuqKrJqvol8HXgt4Atm10CADsAPx7UuKpOrqp5VTVvYmKixTIlzQT7rDS7tBkA7gL2SbJpkgAHAjcBlwBHNMscDZzbYg2SJGmANo8BuJzewX5XAzc02zoZeD9wXJLFwDbAqW3VIEmSBmv1aoBV9RHgI1Nm3w7s3eZ2JUnSqnkmQEmSOsgAIElSBxkAJEnqIAOAJEkdZACQJKmDDACSJHWQAUCSpA4yAEiS1EEGAEmSOsgAIElSBxkAJEnqIAOAJEkdZACQJKmDDACSJHWQAUCSpA4yAEiS1EEGAEmSOsgAIElSB7UaAJJsmeTsJLckuTnJvkm2TnJRktua31u1WYMkSVpR2yMAnwXOr6oXAC8GbgaOBy6uql2Ai5tpSZI0Qq0FgCRbAC8HTgWoqser6iHgMGBBs9gC4PC2apAkSYO1OQLwXGAS+HKSa5KckmQzYLuqugeg+b1tizVIkqQB2gwAc4A9gS9W1UuAnzKN4f4k85MsTLJwcnKyrRolzRD7rDS7tBkAlgBLquryZvpseoHgviRzAZrf9w9qXFUnV9W8qpo3MTHRYpmSZoJ9VppdWgsAVXUvcHeSXZtZBwI3AecBRzfzjgbObasGSZI02JyW1/8O4PQkGwG3A2+iFzrOSnIscBfw2pZrkCRJU7QaAKrqWmDegLsObHO7kiRp1TwToCRJHWQAkCSpgwwAkiR1kAFAkqQOMgBIktRBBgBJkjrIACBJUgcNFQDS84YkH26md0yyd7ulSZKktgw7AvDXwL7AUc30I8AXWqlIkiS1btgzAb60qvZMcg1AVT3YnN5XkiTNQsOOAPwyyYZAASSZAJa1VpUkSWrVsAHgc8A5wLZJPg5cBnyitaokSVKrhtoFUFWnJ7mK3kV8AhxeVTe3WpkkSWrNagNAkg2A66tqd+CW9kuSJEltW+0ugKpaBlyXZMcR1CNJkkZg2G8BzAUWJbkC+OnymVX16laqktQZJ1147bhLWK+95eA9xl2C1lHDBoCPtlqFJEkaqWEPAvz2mm6g+frgQuBHVfXKJDsDZwBbA1cDb6yqx9d0/ZIkafqGPRXwPkmuTPJokseTPJHk4SG38S6g/xsDnwZOrKpdgAeBY6dXsiRJWlvDngfg8/ROA3wbsAnw5mbeKiXZAfh94JRmOsABwNnNIguAw6dXsiRJWltDXw2wqhYDG1bVE1X1ZWD/IZr9FfA+njxr4DbAQ1W1tJleAmw/fLmSJGkmDBsAftac+//aJH+e5N3AZqtqkOSVwP1VdVX/7AGL1kraz0+yMMnCycnJIcuUNC72WWl2GTYAvLFZ9u30vgb4HOA1q2mzH/DqJHfSO+jvAHojAlsmWX7w4Q7Ajwc1rqqTq2peVc2bmJgYskxJ42KflWaXVQaA5Sf/qaofVtVjVfVwVX20qo5rdgmsVFV9oKp2qKqdgNcB/1xVrwcuAY5oFjsaOHetH4UkSZqW1Y0AfGP5jSRfm6Ftvh84LsliescEnDpD65UkSUNa3XkA+vfZP3dNN1JVlwKXNrdvB/Ze03VJkqS1t7oRgFrJbUmSNIutbgTgxc0JfwJs0nfynwBVVVu0Wp0kSWrFKgNAVW04qkIkSdLoDH0iIEmStP4wAEiS1EEGAEmSOsgAIElSBxkAJEnqoNV9DVCSpBWcdOG14y5hvfWWg/cYyXYcAZAkqYMMAJIkdZABQJKkDjIASJLUQQYASZI6yG8BaOw8mrhdozqiWNLs4giAJEkdZACQJKmDWgsASZ6T5JIkNydZlORdzfytk1yU5Lbm91Zt1SBJkgZrcwRgKfCeqvoNYB/gbUl2A44HLq6qXYCLm2lJkjRCrQWAqrqnqq5ubj8C3AxsDxwGLGgWWwAc3lYNkiRpsJEcA5BkJ+AlwOXAdlV1D/RCArDtKGqQJElPaj0AJNkc+Brwx1X18DTazU+yMMnCycnJ9gqUNCPss9Ls0up5AJI8jd4//9Or6uvN7PuSzK2qe5LMBe4f1LaqTgZOBpg3b14Nu02/U94ev0+uVVnTPitpPNr8FkCAU4Gbq+ozfXedBxzd3D4aOLetGiRJ0mBtjgDsB7wRuCHJ8o/lfwJ8CjgrybHAXcBrW6xBkiQN0FoAqKrLgKzk7gPb2q4kSVo9zwQoSVIHGQAkSeogA4AkSR1kAJAkqYMMAJIkdZABQJKkDjIASJLUQQYASZI6yAAgSVIHGQAkSeogA4AkSR1kAJAkqYMMAJIkdZABQJKkDjIASJLUQQYASZI6yAAgSVIHGQAkSeqgsQSAJIckuTXJ4iTHj6MGSZK6bOQBIMmGwBeAQ4HdgKOS7DbqOiRJ6rJxjADsDSyuqtur6nHgDOCwMdQhSVJnjSMAbA/c3Te9pJknSZJGZM4YtpkB82qFhZL5wPxm8tEkt7Za1fg8E3hg3EUM463jLmDdMWteM5j263Z+VR2yJtuxz66b7Le/Mmtet5H12aoV/ve2Ksm+wAlV9bvN9AcAquqTIy1kHZFkYVXNG3cdGp6vWbf5+s9Ovm4rGscugCuBXZLsnGQj4HXAeWOoQ5Kkzhr5LoCqWprk7cAFwIbAl6pq0ajrkCSpy8ZxDABV9S3gW+PY9jro5HEXoGnzNes2X//ZyddtipEfAyBJksbPUwFLktRBBgBJkjrIACBJUgcZACRJ6iADgCRJHWQAkCSpgwwAkiR1kAFAkqQOMgBIktRBBgBJkjrIACBJUgcZANZQkieSXNv3c/w02u6f5Jtruf1Lk6zRta1nYvvNep6W5FNJbktyY5Irkhw6YLkTkhwzYP6mSU5PckPT/rIkm69tXc26/zTJQTOwnpl6rnZOcnnzXJ3ZXApbI2a/td9Ocz1vT7I4SSV55tqub10zlqsBrid+XlV7jGPDSTYcx3YH+DNgLrB7Vf0iyXbA70yj/buA+6rqhQBJdgV+OWzjJHOqaumg+6rqw9OoYxQ+DZxYVWck+RvgWOCLY66pi+y39tvp+A7wTeDSMdfRCkcAZliSO5N8Isn3kixMsmeSC5L8W5K39i26RZJzktyU5G+SbNC0/2LTblGSj05Z74eTXAa8tm/+BkkWJPlYM31ws+2rk3x1eTJPckiSW5r2fzADj3NT4H8A76iqXwBU1X1VddY0VjMX+NHyiaq6tXlD2inJjX3bem+SE5rblzbP77eBDzbPy/LnbtMkdzefcE5LckSSQ5Oc1beu/ZP8Y3N7VM9VgAOAs5tZC4DD13a9mjn2W/vtIFV1TVXdORPrWhcZANbcJnnqUOKRfffdXVX7Av8KnAYcAewD/GnfMnsD7wFeCDyPJ/9gP1hV84AXAb+T5EV9bR6rqpdV1RnN9BzgdOAHVfWh9IaoPgQcVFV7AguB45JsDPwt8Crgt4FnDXpASXad8pj6f7acsvjzgbuq6uEhn69BvgS8v+nMH0uyy5Dttqyq36mqjwLX8eSnl1cBF1RV/6eRi4B9kmzWTB8JnDni52ob4KG+Tz1LgO2HfKyaWfZb++2wz9V6z10Aa25VQ4nnNb9vADavqkeAR5I81vdHdkVV3Q6Q5CvAy+h9QvzDJPPpvTZzgd2A65s2Z07ZzknAWVX18WZ6n2b57/Q+dLIR8D3gBcAdVXVbs71/AOZPLbqqbgVGNjxaVdcmeS5wMHAQcGWSfYGfr6bpmVNuHwlcArwO+Osp21ia5HzgVUnOBn4feB+9N59RPVcZMK+GbKuZZb9dSx3qt+s9A0A7ftH8XtZ3e/n08ud86j+ASrIz8F7gN6vqwSSnARv3LfPTKW2+C7wiyV9W1WP0/tFcVFVH9S+UZI8B21tBevvypr5ZLbd/VT3UN70Y2DHJ05s3yjVSVY8CXwe+nmQZ8HtNDf2jUxtPadb/PJwHfDLJ1sBewD8P2MyZwNuA/wCurKpH0nv3GNVz9QCwZZ7c97kD8OPVbUMjZ78dUkf67XrPXQDjs3d6R4ZvQC8JXwZsQa+T/CS9A3NWODJ3ilOBbwFfTTIH+D6wX5Lnw6/2rf06cAuwc5LnNe2OGrSyZl/eHiv5eWjKsj9rtv+5NEe0J5mb5A3DPgFJ9kuyVXN7I3rJ/ofAfcC2SbZJ8mvAK1e2juaN6Args8A3q+qJAYtdCuxJb9/n8s4/yueq6H3SOaKZdTRw7sqfGa3D7Lcd6bddYABYc1P3JX5qmu2/B3wKuBG4Azinqq4DrgEW0dvP9p3VraSqPgNcDfw98O/AMcBXklxPr7O8oPmUMR/4p/QOkPnhNGtdmQ8Bk8BN6R38841meljPA76d5AZ6j3sh8LVmX+CfApfTOwL3ltWs50zgDawk2TdvLt+k98b8zWbeJKN9rt5Pb1/lYnrHBJw6Q+vV9Nhv7bdDS/LOJEvojdpdn+SUmVjvuiK9DydSe9I7EvjOqjptzKVIGpL9dv3nCIAkSR3kQYAahUuBzu1fk2a5S7HfrtfcBSBJUge5C0CSpA4yAEiS1EGz4hiAQw45pM4///xxlyF1waCzFk6bfVYamTXus7NiBOCBBx4YdwmSpsE+K637ZkUAkCRJM8sAIElSBxkAJEnqoFlxEKCk9ddJF1477hLWa2852KvfarBWRwCSvDvJoiQ3JvlKko2bK2ldnuS2JGcuvyKVJEkandYCQJLtgXcC86pqd2BD4HXAp4ETq2oX4EHg2LZqkCRJg7V9DMAcepffnANsCtwDHACc3dy/ADi85RokSdIUrQWAqvoR8BfAXfT+8f8EuAp4qKqWNostAbZvqwZJkjRYm7sAtgIOA3YGng1sBhw6YNGBVyNKMj/JwiQLJycn2ypT0gyxz0qzS5u7AA4C7qiqyar6JfB14LeALZtdAgA7AD8e1LiqTq6qeVU1b2JiosUyJc0E+6w0u7QZAO4C9kmyaZIABwI3AZcARzTLHA2c22INkiRpgDaPAbic3sF+VwM3NNs6GXg/cFySxcA2wKlt1SBJkgZr9URAVfUR4CNTZt8O7N3mdiVJ0qp5KmBJkjrIACBJUgcZACRJ6iADgCRJHWQAkCSpgwwAkiR1UKtfA5QkrZ9OuvDacZew3nrLwXuMZDuOAEiS1EEGAEmSOsgAIElSBxkAJEnqIAOAJEkdZACQJKmDDACSJHWQAUCSpA4yAEiS1EEGAEmSOqjVAJBkyyRnJ7klyc1J9k2ydZKLktzW/N6qzRokSdKK2h4B+CxwflW9AHgxcDNwPHBxVe0CXNxMS5KkEWotACTZAng5cCpAVT1eVQ8BhwELmsUWAIe3VYMkSRqszRGA5wKTwJeTXJPklCSbAdtV1T0Aze9tW6xBkiQN0GYAmAPsCXyxql4C/JRpDPcnmZ9kYZKFk5OTbdUoaYbYZ6XZpc0AsARYUlWXN9Nn0wsE9yWZC9D8vn9Q46o6uarmVdW8iYmJFsuUNBPss9Ls0loAqKp7gbuT7NrMOhC4CTgPOLqZdzRwbls1SJKkwea0vP53AKcn2Qi4HXgTvdBxVpJjgbuA17ZcgyRJmqLVAFBV1wLzBtx1YJvblSRJq+aZACVJ6iADgCRJHWQAkCSpgwwAkiR1kAFAkqQOMgBIktRBBgBJkjrIACBJUgcNFQDS84YkH26md0yyd7ulSZKktgw7AvDXwL7AUc30I8AXWqlIkiS1bthTAb+0qvZMcg1AVT3YnN9fkiTNQsOOAPwyyYZAASSZAJa1VpUkSWrVsAHgc8A5wLZJPg5cBnyitaokSVKrhtoFUFWnJ7mK3lX8AhxeVTe3WpkkSWrNagNAkg2A66tqd+CW9kuSJEltW+0ugKpaBlyXZMcR1CNJkkZg2G8BzAUWJbkC+OnymVX16laqkiRJrRo2AHy01SokSdJIDXsQ4LfXdAPN1wcXAj+qqlcm2Rk4A9gauBp4Y1U9vqbrlyRJ0zfsqYD3SXJlkkeTPJ7kiSQPD7mNdwH93xj4NHBiVe0CPAgcO72SJUnS2hr2PACfp3ca4NuATYA3N/NWKckOwO8DpzTTAQ4Azm4WWQAcPr2SJUnS2hr2GACqanGSDavqCeDLSb47RLO/At4HPL2Z3gZ4qKqWNtNLgO2nU7AkSVrRVVddte2cOXNOAXbnqR/wlwE3Ll269M177bXX/ctnDhsAftac+//aJH8O3ANstqoGSV4J3F9VVyXZf/nsAYvWStrPB+YD7Lij30CU1nX2WWm85syZc8qznvWs35iYmHhwgw02+NX/1mXLlmVycnK3e++99xTgV9/eG3YXwBubZd9O72uAzwFes5o2+wGvTnInvYP+DqA3IrBlkuXBYwfgx4MaV9XJVTWvquZNTEwMWaakcbHPSmO3+8TExMP9//wBNthgg5qYmPgJvZGBX1nlCECSHavqrqr6YTPrMYb8SmBVfQD4QLOe/YH3VtXrk3wVOIJeKDgaOHeY9Q3rpAuvncnVqc9bDt5j3CVIklZug6n//PvuKKZ86F/dCMA3lt9I8rW1rw2A9wPHJVlM75iAU2dovZIkaUirOwagf5/9c9d0I1V1KXBpc/t2YO81XZckSVp7qxsBqJXcliRJ65Zly5YtG3SwPc38Zf3zVhcAXpzk4SSPAC9qbj+c5JFpnAhIkiS178bJyclnTA0BzbcAngHc2D9/lbsAqmrDFgqUJEkzbOnSpW++9957T7n33ntXeh6A/uWHPhGQJEladzUn+Rn6Kr3DngdAkiStRwwAkiR1kAFAkqQOMgBIktRBBgBJkjrIACBJUgcZACRJ6iADgCRJHWQAkCSpgwwAkiR1kAFAkqQOMgBIktRBBgBJkjqotQCQ5DlJLklyc5JFSd7VzN86yUVJbmt+b9VWDZIkabA2RwCWAu+pqt8A9gHelmQ34Hjg4qraBbi4mZYkSSPUWgCoqnuq6urm9iPAzcD2wGHAgmaxBcDhbdUgSZIGG8kxAEl2Al4CXA5sV1X3QC8kANuOogZJkvSk1gNAks2BrwF/XFUPT6Pd/CQLkyycnJxsr0BJM8I+K80urQaAJE+j98//9Kr6ejP7viRzm/vnAvcPaltVJ1fVvKqaNzEx0WaZkmaAfVaaXdr8FkCAU4Gbq+ozfXedBxzd3D4aOLetGiRJ0mBzWlz3fsAbgRuSXNvM+xPgU8BZSY4F7gJe22INkiRpgNYCQFVdBmQldx/Y1nYlSdLqtTkCIA3lpAuvXf1CWmNvOXiPcZcgaR3kqYAlSeogA4AkSR1kAJAkqYMMAJIkdZABQJKkDjIASJLUQQYASZI6yAAgSVIHGQAkSeogA4AkSR1kAJAkqYMMAJIkdZABQJKkDjIASJLUQQYASZI6yAAgSVIHjSUAJDkkya1JFic5fhw1SJLUZSMPAEk2BL4AHArsBhyVZLdR1yFJUpeNYwRgb2BxVd1eVY8DZwCHjaEOSZI6axwBYHvg7r7pJc08SZI0InPGsM0MmFcrLJTMB+Y3k48mubXVqsbnmcAD4y5iGG8ddwHrjlnzmsG0X7fzq+qQNdmOfXbdZL/9lVnzuo2sz1at8L+3VUn2BU6oqt9tpj8AUFWfHGkh64gkC6tq3rjr0PB8zbrN13928nVb0Th2AVwJ7JJk5yQbAa8DzhtDHZIkddbIdwFU1dIkbwcuADYEvlRVi0ZdhyRJXTaOYwCoqm8B3xrHttdBJ4+7AE2br1m3+frPTr5uU4z8GABJkjR+ngpYkqQOMgBIktRBBgBJkjrIACBJUgcZACRJ6iADgCRJHWQAkCSpgwwAkiR1kAFAkqQOMgBIktRBBgBJkjrIACBJUgcZANZQkieSXNv3c/w02u6f5Jtruf1Lk8xbw7Zrvf1mPRsl+ask/5ZkcZJvJtlxJcuelmT/AfO3a9pdl+SmJDN2lcgkpyTZbQbWc0ySz8/AevZKckPzXH0uSdZ2nRqefdY+uwbr+XiSu5M8urbrWheN5XLA64mfV9Ue49hwkg3Hsd0BPgE8Hfj1qnoiyZuAc5PsVVXLhlzHnwIXVdVnAZK8aDoFJNmwqp4YdF9VvXk66xqBLwLzge/Tuxz2IcD/HWtF3WKftc9O1z8CnwduG3chbXAEYIYluTPJJ5J8L8nCJHsmuaBJ3G/tW3SLJOc0CfpvkmzQtP9i025Rko9OWe+Hk1wGvLZv/gZJFiT5WDN9cLPtq5N8NcnmzfxDktzStP+DGXicmwJvAt69vDNX1ZeBR4GDprGqucCS5RNVdX2z/qd84kny+STHNLf7n4v3Jbmib7mdkixfx6VJ5iX5n0n+vG+ZY5L87+b2G5Jc0XwiPGn5G3WSNyX5QZJvA/tN68kZIMlcYIuq+l71rsH9d8Dha7terT37rH12Zarq+1V1z0ysa11kAFhzm+Spw4lH9t13d1XtC/wrcBpwBLAPveS83N7Ae4AXAs/jyQ7+waqaB7wI+J0p6fqxqnpZVZ3RTM8BTgd+UFUfSvJM4EPAQVW1J7AQOC7JxsDfAq8Cfht41qAHlGTXKY+p/2fLKYs/H7irqh6eMn8hMJ0hvC8Apya5JMkHkzx7yHYt3xkrAAAQSElEQVTLn4tPAhsleW4z/0jgrCnLns1T30CPBM5M8hvN7f2aT4ZPAK9v/ll/lN6byH9Z2eNJ8oqVPFffHbD49vS9aTa3tx/ysWpm2Gfts9Pps+s9dwGsuVUNJ57X/L4B2LyqHgEeSfJYX6e8oqpuB0jyFeBl9P7o/zDJfHqvzVx6f8jXN23OnLKdk4CzqurjzfQ+zfLfSW/38kbA94AXAHdU1W3N9v6B3lD0U1TVrcCwQ6QBaiXzh1ZVFzRvBIcAhwLXJNl9iKb9z8VZwB8Cn6L35tD/xk5VTSa5Pck+9IbydgW+A7wN2Au4snm+NgHuB14KXFpVkwBJzgR+fUDtlzC952uFVQzZVjPDPmufnU6fXe8ZANrxi+b3sr7by6eXP+dTO2Il2Rl4L/CbVfVgktOAjfuW+emUNt8FXpHkL6vqMXod+aKqOqp/oSR7DNjeCpLsyopvWMvtX1UP9U0vBv5Tkqc3b5bL7UnvTXFoVfUfwP8B/k8zhPhy4D6eOkK18ZRm/c/FmcBXk3y9t7oatL/uTHpvOLcA51RVpfcOsqCqPtC/YJLDGe75egVw4oC7flZVvzVl3hJgh77pHYAfr24bGhn77DR0pM+u99wFMD57J9k5vf2IRwKXAVvQ6yQ/SbIdvXS9KqfSO5jsq0nm0Du4bL8kz4fePr8kv06vA+2c5HlNu6MGrayqbq2qPVby89CUZX8KLAA+07cP7o+Ax+gl9aEkOSC9fZMkeTq9odW7gB8CuyX5tSTPAA5c2Tqq6t/oDQX+L1b+Zvh1evvcj+pb5mLgiCTbNtvfOsl/Ai4H9k+yTZKn0bf/dsp2L1nJc7XCG0mzH/GRJPs0b2J/BJy7qudG6xz7LN3ps13gCMCa2yTJtX3T51fV0F8rojfM9yl6+xP/hV7CXZbkGmARcDtDdMqq+kzT2f4eeD1wDPCVJL/WLPKhqvpBM0T5T0keoPfGNcyQ3ep8APh/gVuTbAJMAvs2B7kNay/g80mW0gukp1TVlQBJzqI3lHobcM1q1nNmU8vOg+5sPp3dBOxWVVc0825K8iHgwuZN/ZfA26rq+0lOoPca3QNcDczEUdz/k97+5U3oHf3vNwBGyz5rn52W9A5E/G/ApkmW0HusJ6ztetcVmd7rLg2W5FnA+cBfV9XJA+4/DTitqi4dcWmSBrDPyhEAzYiquhcPrpFmDfusPAZAo/IN4M5xFyFpaPbZ9Zy7ACRJ6iBHACRJ6qBZcQzAIYccUueff/64y5C6YEYuUGSflUZmjfvsrBgBeOCBB8ZdgqRpsM9K675ZEQAkSdLMMgBIktRBBgBJkjrIACBJUge1GgCSvDvJoiQ3JvlKko2bi2lcnuS2JGcm2ajNGiRJ0opaCwBJtgfeCcyrqt3pXZjhdcCngROrahfgQeDYtmqQJEmDtb0LYA69K3DNATald5WmA3jy2tML6F3uUZIkjVBrAaCqfgT8Bb3rRN8D/AS4CnioqpY2iy0Btm+rBkmSNFibuwC2Ag6jd63nZwObAYcOWHTgxQiSzE+yMMnCycnJtsqUNEPss9Ls0uYugIOAO6pqsqp+CXwd+C1gy2aXAMAOwI8HNa6qk6tqXlXNm5iYaLFMSTPBPivNLm0GgLuAfZJsmiTAgcBNwCXAEc0yRwPntliDJEkaoM1jAC6nd7Df1cANzbZOBt4PHJdkMbANcGpbNUiSpMFavRpgVX0E+MiU2bcDe7e5XUmStGqeCVCSpA4yAEiS1EEGAEmSOsgAIElSBxkAJEnqIAOAJEkdZACQJKmDDACSJHWQAUCSpA4yAEiS1EEGAEmSOsgAIElSBxkAJEnqIAOAJEkdZACQJKmDDACSJHWQAUCSpA4yAEiS1EGtBoAkWyY5O8ktSW5Osm+SrZNclOS25vdWbdYgSZJW1PYIwGeB86vqBcCLgZuB44GLq2oX4OJmWpIkjVBrASDJFsDLgVMBqurxqnoIOAxY0Cy2ADi8rRokSdJgbY4APBeYBL6c5JokpyTZDNiuqu4BaH5v22INkiRpgDYDwBxgT+CLVfUS4KdMY7g/yfwkC5MsnJycbKtGSTPEPivNLm0GgCXAkqq6vJk+m14guC/JXIDm9/2DGlfVyVU1r6rmTUxMtFimpJlgn5Vml9YCQFXdC9ydZNdm1oHATcB5wNHNvKOBc9uqQZIkDTan5fW/Azg9yUbA7cCb6IWOs5IcC9wFvLblGiRJ0hStBoCquhaYN+CuA9vcriRJWjXPBChJUgcZACRJ6iADgCRJHWQAkCSpgwwAkiR1kAFAkqQOMgBIktRBQwWA9LwhyYeb6R2T7N1uaZIkqS3DjgD8NbAvcFQz/QjwhVYqkiRJrRv2TIAvrao9k1wDUFUPNqf3lSRJs9CwIwC/TLIhUABJJoBlrVUlSZJaNWwA+BxwDrBtko8DlwGfaK0qSZLUqqF2AVTV6UmuoncRnwCHV9XNrVYmSZJas9oAkGQD4Pqq2h24pf2SJElS21a7C6CqlgHXJdlxBPVIkqQRGPZbAHOBRUmuAH66fGZVvbqVqiRJUquGDQAfbbUKSZI0UsMeBPjtNd1A8/XBhcCPquqVSXYGzgC2Bq4G3lhVj6/p+iVJ0vQNeyrgfZJcmeTRJI8neSLJw0Nu411A/zcGPg2cWFW7AA8Cx06vZEmStLaGPQ/A5+mdBvg2YBPgzc28VUqyA/D7wCnNdIADgLObRRYAh0+vZEmStLaGvhpgVS0GNqyqJ6rqy8D+QzT7K+B9PHnWwG2Ah6pqaTO9BNh++HIlSdJMGDYA/Kw59/+1Sf48ybuBzVbVIMkrgfur6qr+2QMWrZW0n59kYZKFk5OTQ5YpaVzss9LsMmwAeGOz7NvpfQ3wOcBrVtNmP+DVSe6kd9DfAfRGBLZMsvzgwx2AHw9qXFUnV9W8qpo3MTExZJmSxsU+K80uqwwAy0/+U1U/rKrHqurhqvpoVR3X7BJYqar6QFXtUFU7Aa8D/rmqXg9cAhzRLHY0cO5aPwpJkjQtqxsB+MbyG0m+NkPbfD9wXJLF9I4JOHWG1itJkoa0uvMA9O+zf+6abqSqLgUubW7fDuy9puuSJElrb3UjALWS25IkaRZb3QjAi5sT/gTYpO/kPwGqqrZotTpJktSKVQaAqtpwVIVIkqTRGfpEQJIkaf1hAJAkqYMMAJIkdZABQJKkDjIASJLUQQYASZI6yAAgSVIHGQAkSeogA4AkSR1kAJAkqYMMAJIkdZABQJKkDjIASJLUQQYASZI6qLUAkOQ5SS5JcnOSRUne1czfOslFSW5rfm/VVg2SJGmwNkcAlgLvqarfAPYB3pZkN+B44OKq2gW4uJmWJEkj1FoAqKp7qurq5vYjwM3A9sBhwIJmsQXA4W3VIEmSBhvJMQBJdgJeAlwObFdV90AvJADbjqIGSZL0pNYDQJLNga8Bf1xVD0+j3fwkC5MsnJycbK9ASTPCPivNLq0GgCRPo/fP//Sq+noz+74kc5v75wL3D2pbVSdX1byqmjcxMdFmmZJmgH1Wml3a/BZAgFOBm6vqM313nQcc3dw+Gji3rRokSdJgc1pc937AG4EbklzbzPsT4FPAWUmOBe4CXttiDZIkaYDWAkBVXQZkJXcf2NZ2JUnS6nkmQEmSOsgAIElSBxkAJEnqoDYPAhyLky68dvULaY285eA9xl2CJGmGrHcBQNLsYmhvl8FdK2MAkCRNm8GtPaMKbR4DIElSBzkCoLHzk0S7HAKWNIgjAJIkdZABQJKkDjIASJLUQQYASZI6yAAgSVIHGQAkSeogA4AkSR1kAJAkqYMMAJIkdZABQJKkDhpLAEhySJJbkyxOcvw4apAkqctGHgCSbAh8ATgU2A04Ksluo65DkqQuG8cIwN7A4qq6vaoeB84ADhtDHZIkddY4AsD2wN1900uaeZIkaUTGcTngDJhXKyyUzAfmN5OPJrm11arG55nAA+MuYhhvHXcB645Z85rBtF+386vqkDXZjn123WS//ZVZ87qNrM9WrfC/t1VJ9gVOqKrfbaY/AFBVnxxpIeuIJAurat6469DwfM26zdd/dvJ1W9E4dgFcCeySZOckGwGvA84bQx2SJHXWyHcBVNXSJG8HLgA2BL5UVYtGXYckSV02jmMAqKpvAd8ax7bXQSePuwBNm69Zt/n6z06+blOM/BgASZI0fp4KWJKkDjIArKUk70xyc5LTW1r/CUne28a6NTOS7J/km+OuQ8Oxz8o+2zOWYwDWM/8PcGhV3THuQiQNxT4r4QjAWknyN8BzgfOSfDDJl5JcmeSaJIc1yxyT5BtJ/jHJHUnenuS4ZpnvJ9m6We5/NG2vS/K1JJsO2N7zkpyf5Kok/5rkBaN9xOuvJDsluSXJKUluTHJ6koOSfCfJbUn2bn6+27x2302y64D1bDbo70DrBvvs+sM+OwOqyp+1+AHupHeGqU8Ab2jmbQn8ANgMOAZYDDwdmAB+Ary1We5E4I+b29v0rfNjwDua2ycA721uXwzs0tx+KfDP437868sPsBOwFHghvWB8FfAlemeuPAz4BrAFMKdZ/iDga83t/YFvNrcH/h2M+/H585TX2j67HvzYZ9f+x10AM+dg4NV9+/42BnZsbl9SVY8AjyT5CfCPzfwbgBc1t3dP8jF6f4Cb0ztPwq8k2Rz4LeCrya/OpvxrbTyQDrujqm4ASLIIuLiqKskN9N5sngEsSLILvdNXP23AOlb2d3Bz28Vr2uyzs599di0YAGZOgNdU1VPOf57kpcAv+mYt65texpOvwWnA4VV1XZJj6CXUfhsAD1XVHjNbtvqs7nX6M3r/GP5rkp2ASwesY+DfgdZJ9tnZzz67FjwGYOZcALwjTdRP8pJptn86cE+SpwGvn3pnVT0M3JHktc36k+TFa1mzpucZwI+a28esZJm1/TvQ6Nhn13/22VUwAMycP6M3vHR9khub6en4X8DlwEXALStZ5vXAsUmuAxbR28+l0flz4JNJvkPvNNaDrO3fgUbHPrv+s8+ugmcClCSpgxwBkCSpgwwAkiR1kAFAkqQOMgBIktRBBgBJkjrIAKA11pxLfVGS65Nc25xARdI6yj6rfp4JUGskyb7AK4E9q+oXSZ4JbDTmsiSthH1WUzkCoDU1F3igqn4BUFUPVNWPk+yV5NvN1c8uSDI3yZzmSlv7AyT5ZJKPj7N4qYPss3oKTwSkNdJc6OQyYFPg/wPOBL4LfBs4rKomkxwJ/G5V/fck/xk4G3gnvbNzvbSqHh9P9VL32Gc1lbsAtEaq6tEkewG/DbyC3pvJx4DdgYua02pvCNzTLL8oyd/Tu6ravr6RSKNln9VUBgCtsap6gt7VtS5tLr/5NmBRVe27kiYvBB4CthtNhZL62WfVz2MAtEaS7NpcY3u5PehdP3uiOdiIJE9rhhFJ8gfANsDLgc8l2XLUNUtdZp/VVB4DoDXSDCX+b2BLYCmwGJgP7AB8jt5lOOcAfwWcQ29f44FVdXeSdwJ7VdXR46hd6iL7rKYyAEiS1EHuApAkqYMMAJIkdZABQJKkDjIASJLUQQYASZI6yAAgSVIHGQAkSeogA4AkSR30/wPCKh6rWBzOwAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 514.88x475.2 with 6 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "grid = sns.FacetGrid(train_df, row='Embarked', col='Survived', size=2.2, aspect=1.6)\n",
    "grid.map(sns.barplot, 'Sex', 'Fare', alpha=.5, ci=None)\n",
    "grid.add_legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 处理数据\n",
    "\n",
    "我们收集了有关数据集和解决方案要求的若干假设和决策。 到目前为止，我们没有更改单个特征来实现这些目标。现在让我们执行决策和假设来修正，创建和完成目标。\n",
    "\n",
    "### 通过删除特征来修正数据\n",
    "\n",
    "通过删除特征减少数据，加快处理，并简化分析。\n",
    "\n",
    "- 根据我们的假设和决策，放弃 Cabin 和 Tickets。\n",
    "\n",
    "- 请注意，我们同时对训练和测试数据集执行操作以保持一致。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-15T16:33:58.068308Z",
     "start_time": "2019-08-15T16:33:58.058334Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Name</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Braund, Mr. Owen Harris</td>\n",
       "      <td>male</td>\n",
       "      <td>22.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n",
       "      <td>female</td>\n",
       "      <td>38.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>Heikkinen, Miss. Laina</td>\n",
       "      <td>female</td>\n",
       "      <td>26.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Futrelle, Mrs. Jacques Heath (Lily May Peel)</td>\n",
       "      <td>female</td>\n",
       "      <td>35.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Allen, Mr. William Henry</td>\n",
       "      <td>male</td>\n",
       "      <td>35.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Survived  Pclass  \\\n",
       "0            1         0       3   \n",
       "1            2         1       1   \n",
       "2            3         1       3   \n",
       "3            4         1       1   \n",
       "4            5         0       3   \n",
       "\n",
       "                                                Name     Sex   Age  SibSp  \\\n",
       "0                            Braund, Mr. Owen Harris    male  22.0      1   \n",
       "1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1   \n",
       "2                             Heikkinen, Miss. Laina  female  26.0      0   \n",
       "3       Futrelle, Mrs. Jacques Heath (Lily May Peel)  female  35.0      1   \n",
       "4                           Allen, Mr. William Henry    male  35.0      0   \n",
       "\n",
       "   Parch     Fare Embarked  \n",
       "0      0   7.2500        S  \n",
       "1      0  71.2833        C  \n",
       "2      0   7.9250        S  \n",
       "3      0  53.1000        S  \n",
       "4      0   8.0500        S  "
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-18T14:33:25.795681Z",
     "start_time": "2019-08-18T14:33:25.789697Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Before (891, 12) (418, 11) (891, 12) (418, 11)\n",
      "After (891, 10) (418, 9) (891, 10) (418, 9)\n"
     ]
    }
   ],
   "source": [
    "print('Before', train_df.shape, test_df.shape, combine[0].shape, combine[1].shape)\n",
    "\n",
    "train_df = train_df.drop(['Ticket', 'Cabin'], axis=1)\n",
    "test_df = test_df.drop(['Ticket', 'Cabin'], axis=1)\n",
    "combine = [train_df, test_df]\n",
    "\n",
    "print('After', train_df.shape, test_df.shape, combine[0].shape, combine[1].shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 从现有特征中创建新特征\n",
    "\n",
    "在删除 Name 和 PassengerId 之前，先分析 Name 特征，提取 titles，并测试title与 survival 的关联。\n",
    "\n",
    "**观察**\n",
    "\n",
    "当我们画出 Title，Age 和 Survived 的图后，我们有了以下新的发现：\n",
    "\n",
    "- 大多数 Title 分段与年龄字段对应准确，比如，Title 为 Master 平均年龄为 5 岁\n",
    "- 不同组别 Title 与生存率有一定的区分度。\n",
    "- 某些特定的 title 如 Mme，Lady，Sir 的乘客存活率较高，但某些 title 如 Don，Rev，Jonkheer 的乘客存活率不高\n",
    "\n",
    "**结论**\n",
    "\n",
    "- 我们决定保留这个新的 Title 特征并加入到训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-18T14:53:48.505741Z",
     "start_time": "2019-08-18T14:53:48.489785Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>Sex</th>\n",
       "      <th>female</th>\n",
       "      <th>male</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Title</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Capt</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Col</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Countess</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Don</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Dr</th>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Jonkheer</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Lady</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Major</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Master</th>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Miss</th>\n",
       "      <td>182</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Mlle</th>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Mme</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Mr</th>\n",
       "      <td>0</td>\n",
       "      <td>517</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Mrs</th>\n",
       "      <td>125</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Ms</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Rev</th>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Sir</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Sex       female  male\n",
       "Title                 \n",
       "Capt           0     1\n",
       "Col            0     2\n",
       "Countess       1     0\n",
       "Don            0     1\n",
       "Dr             1     6\n",
       "Jonkheer       0     1\n",
       "Lady           1     0\n",
       "Major          0     2\n",
       "Master         0    40\n",
       "Miss         182     0\n",
       "Mlle           2     0\n",
       "Mme            1     0\n",
       "Mr             0   517\n",
       "Mrs          125     0\n",
       "Ms             1     0\n",
       "Rev            0     6\n",
       "Sir            0     1"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for dataset in combine:\n",
    "    dataset['Title'] = dataset.Name.str.extract(' ([A-Za-z]+)\\.', expand=False)\n",
    "\n",
    "# crosstab 交叉表，两个参数分别作为行列 \n",
    "# 参考 https://blog.csdn.net/hustqb/article/details/78086394#%E4%BA%A4%E5%8F%89%E8%A1%A8crosstab\n",
    "pd.crosstab(train_df['Title'], train_df['Sex'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-18T14:42:55.183621Z",
     "start_time": "2019-08-18T14:42:55.179629Z"
    }
   },
   "source": [
    "我们可以将一些 titles 替换为更一般的名字，或者分类为 Rare（稀有）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-18T14:53:54.781979Z",
     "start_time": "2019-08-18T14:53:54.767987Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Title</th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Master</td>\n",
       "      <td>0.575000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Miss</td>\n",
       "      <td>0.702703</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Mr</td>\n",
       "      <td>0.156673</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Mrs</td>\n",
       "      <td>0.793651</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Rare</td>\n",
       "      <td>0.347826</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    Title  Survived\n",
       "0  Master  0.575000\n",
       "1    Miss  0.702703\n",
       "2      Mr  0.156673\n",
       "3     Mrs  0.793651\n",
       "4    Rare  0.347826"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for dataset in combine:\n",
    "    # 替换稀有的名字\n",
    "    dataset['Title'] = dataset['Title'].replace(['Lady', 'Countess','Capt', 'Col',\\\n",
    " \t'Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')\n",
    "\n",
    "    # 修正错误的名字\n",
    "    dataset['Title'] = dataset['Title'].replace('Mlle', 'Miss')\n",
    "    dataset['Title'] = dataset['Title'].replace('Ms', 'Miss')\n",
    "    dataset['Title'] = dataset['Title'].replace('Mme', 'Mrs')\n",
    "    \n",
    "train_df[['Title', 'Survived']].groupby(['Title'], as_index=False).mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-18T14:45:09.980951Z",
     "start_time": "2019-08-18T14:45:09.968953Z"
    }
   },
   "source": [
    "将类别 titles 转换为有序的数值型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-18T14:54:08.479328Z",
     "start_time": "2019-08-18T14:54:08.466335Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Name</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked</th>\n",
       "      <th>Title</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Braund, Mr. Owen Harris</td>\n",
       "      <td>male</td>\n",
       "      <td>22.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n",
       "      <td>female</td>\n",
       "      <td>38.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>Heikkinen, Miss. Laina</td>\n",
       "      <td>female</td>\n",
       "      <td>26.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>S</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Futrelle, Mrs. Jacques Heath (Lily May Peel)</td>\n",
       "      <td>female</td>\n",
       "      <td>35.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>S</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Allen, Mr. William Henry</td>\n",
       "      <td>male</td>\n",
       "      <td>35.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Survived  Pclass  \\\n",
       "0            1         0       3   \n",
       "1            2         1       1   \n",
       "2            3         1       3   \n",
       "3            4         1       1   \n",
       "4            5         0       3   \n",
       "\n",
       "                                                Name     Sex   Age  SibSp  \\\n",
       "0                            Braund, Mr. Owen Harris    male  22.0      1   \n",
       "1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1   \n",
       "2                             Heikkinen, Miss. Laina  female  26.0      0   \n",
       "3       Futrelle, Mrs. Jacques Heath (Lily May Peel)  female  35.0      1   \n",
       "4                           Allen, Mr. William Henry    male  35.0      0   \n",
       "\n",
       "   Parch     Fare Embarked  Title  \n",
       "0      0   7.2500        S      1  \n",
       "1      0  71.2833        C      3  \n",
       "2      0   7.9250        S      2  \n",
       "3      0  53.1000        S      3  \n",
       "4      0   8.0500        S      1  "
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "title_mapping = {\"Mr\": 1, \"Miss\": 2, \"Mrs\": 3, \"Master\": 4, \"Rare\": 5}\n",
    "\n",
    "for dataset in combine:\n",
    "    dataset['Title'] = dataset['Title'].map(title_mapping)\n",
    "    dataset['Title'] = dataset['Title'].fillna(0)\n",
    "    \n",
    "train_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在可以在训练和测试集中删除 Name 特征，在训练集中删除 PassengerId 特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-18T15:04:29.496698Z",
     "start_time": "2019-08-18T15:04:29.489682Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((891, 9), (418, 9))"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df = train_df.drop(['Name', 'PassengerId'], axis=1)\n",
    "test_df = test_df.drop(['Name'], axis=1)\n",
    "combine = [train_df, test_df]\n",
    "train_df.shape, test_df.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 转换类型特征\n",
    "\n",
    "转换包含字符的特征为数值特征，在大部分模型中都需要这样转换。 这样做也帮助我们完成特征补全的目标。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-18T15:08:24.640530Z",
     "start_time": "2019-08-18T15:08:24.629561Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked</th>\n",
       "      <th>Title</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>22.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>38.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>26.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>S</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>35.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>S</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>35.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Survived  Pclass  Sex   Age  SibSp  Parch     Fare Embarked  Title\n",
       "0         0       3    0  22.0      1      0   7.2500        S      1\n",
       "1         1       1    1  38.0      1      0  71.2833        C      3\n",
       "2         1       3    1  26.0      0      0   7.9250        S      2\n",
       "3         1       1    1  35.0      1      0  53.1000        S      3\n",
       "4         0       3    0  35.0      0      0   8.0500        S      1"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for dataset in combine:\n",
    "    dataset['Sex'] = dataset['Sex'].map({'female': 1, 'male': 0}).astype(int)\n",
    "    \n",
    "train_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 补全连续型数值特征\n",
    "\n",
    "对缺失值或者 null 值特征进行估计或者补全， 从 age 开始。\n",
    "\n",
    "考虑三种方法来补全连续型特征。\n",
    "\n",
    "1. 一个简单的方法是使用平均值和标准差之间的随机数\n",
    "2. 更准确的方式是使用相关的特征来猜测确实特征。在我们的例子中，我们将 Age, Gender 和 Pclass 认为是相关的。使用 Pclass 和 Gender 对应的中位数作为 Age 的值，当 Pclass=1 且 Gender=0 时，当 Pclass=1 且 Gender=1 时，等等…\n",
    "3. 联合方法 1 和 2。我们可以根据一系列 Pclass 与 Gender 的组合，并使用第一种方法里提到的随机数来猜测缺失的 Age 值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-18T15:27:43.375675Z",
     "start_time": "2019-08-18T15:27:42.768270Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\seaborn\\axisgrid.py:230: UserWarning: The `size` paramter has been renamed to `height`; please update your code.\n",
      "  warnings.warn(msg, UserWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<seaborn.axisgrid.FacetGrid at 0x2b3662533c8>"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 514.88x475.2 with 6 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "grid = sns.FacetGrid(train_df, row='Pclass', col='Sex', size=2.2, aspect=1.6)\n",
    "grid.map(plt.hist, 'Age', alpha=.5, bins=20)\n",
    "grid.add_legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "创建一个空的数组来保存以 Pclass X Gender 对 Age 的猜测值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0.],\n",
       "       [0., 0., 0.]])"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "guess_ages = np.zeros((2,3))\n",
    "guess_ages"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "遍历 Sex(0 或 1) Pclass(1,2,3) 的六种组合来作为 Age 的猜测值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked</th>\n",
       "      <th>Title</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>22</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>38</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>26</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>S</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>35</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>S</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Survived  Pclass  Sex  Age  SibSp  Parch     Fare Embarked  Title\n",
       "0         0       3    0   22      1      0   7.2500        S      1\n",
       "1         1       1    1   38      1      0  71.2833        C      3\n",
       "2         1       3    1   26      0      0   7.9250        S      2\n",
       "3         1       1    1   35      1      0  53.1000        S      3\n",
       "4         0       3    0   35      0      0   8.0500        S      1"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for dataset in combine:\n",
    "    for i in range(0, 2):\n",
    "        for j in range(0, 3):\n",
    "            guess_df = dataset[(dataset['Sex'] == i) & \\\n",
    "                                  (dataset['Pclass'] == j+1)]['Age'].dropna()\n",
    "\n",
    "            # age_mean = guess_df.mean()\n",
    "            # age_std = guess_df.std()\n",
    "            # age_guess = rnd.uniform(age_mean - age_std, age_mean + age_std)\n",
    "\n",
    "            age_guess = guess_df.median()\n",
    "\n",
    "            # Convert random age float to nearest .5 age\n",
    "            guess_ages[i,j] = int( age_guess/0.5 + 0.5 ) * 0.5\n",
    "            \n",
    "    for i in range(0, 2):\n",
    "        for j in range(0, 3):\n",
    "            dataset.loc[ (dataset.Age.isnull()) & (dataset.Sex == i) & (dataset.Pclass == j+1),\\\n",
    "                    'Age'] = guess_ages[i,j]\n",
    "\n",
    "    dataset['Age'] = dataset['Age'].astype(int)\n",
    "\n",
    "train_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "创建 Age 分段，并决定它与 Surivied 的相关度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on function cut in module pandas.core.reshape.tile:\n",
      "\n",
      "cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise')\n",
      "    Bin values into discrete intervals.\n",
      "    \n",
      "    Use `cut` when you need to segment and sort data values into bins. This\n",
      "    function is also useful for going from a continuous variable to a\n",
      "    categorical variable. For example, `cut` could convert ages to groups of\n",
      "    age ranges. Supports binning into an equal number of bins, or a\n",
      "    pre-specified array of bins.\n",
      "    \n",
      "    Parameters\n",
      "    ----------\n",
      "    x : array-like\n",
      "        The input array to be binned. Must be 1-dimensional.\n",
      "    bins : int, sequence of scalars, or pandas.IntervalIndex\n",
      "        The criteria to bin by.\n",
      "    \n",
      "        * int : Defines the number of equal-width bins in the range of `x`. The\n",
      "          range of `x` is extended by .1% on each side to include the minimum\n",
      "          and maximum values of `x`.\n",
      "        * sequence of scalars : Defines the bin edges allowing for non-uniform\n",
      "          width. No extension of the range of `x` is done.\n",
      "        * IntervalIndex : Defines the exact bins to be used. Note that\n",
      "          IntervalIndex for `bins` must be non-overlapping.\n",
      "    \n",
      "    right : bool, default True\n",
      "        Indicates whether `bins` includes the rightmost edge or not. If\n",
      "        ``right == True`` (the default), then the `bins` ``[1, 2, 3, 4]``\n",
      "        indicate (1,2], (2,3], (3,4]. This argument is ignored when\n",
      "        `bins` is an IntervalIndex.\n",
      "    labels : array or bool, optional\n",
      "        Specifies the labels for the returned bins. Must be the same length as\n",
      "        the resulting bins. If False, returns only integer indicators of the\n",
      "        bins. This affects the type of the output container (see below).\n",
      "        This argument is ignored when `bins` is an IntervalIndex.\n",
      "    retbins : bool, default False\n",
      "        Whether to return the bins or not. Useful when bins is provided\n",
      "        as a scalar.\n",
      "    precision : int, default 3\n",
      "        The precision at which to store and display the bins labels.\n",
      "    include_lowest : bool, default False\n",
      "        Whether the first interval should be left-inclusive or not.\n",
      "    duplicates : {default 'raise', 'drop'}, optional\n",
      "        If bin edges are not unique, raise ValueError or drop non-uniques.\n",
      "    \n",
      "        .. versionadded:: 0.23.0\n",
      "    \n",
      "    Returns\n",
      "    -------\n",
      "    out : pandas.Categorical, Series, or ndarray\n",
      "        An array-like object representing the respective bin for each value\n",
      "        of `x`. The type depends on the value of `labels`.\n",
      "    \n",
      "        * True (default) : returns a Series for Series `x` or a\n",
      "          pandas.Categorical for all other inputs. The values stored within\n",
      "          are Interval dtype.\n",
      "    \n",
      "        * sequence of scalars : returns a Series for Series `x` or a\n",
      "          pandas.Categorical for all other inputs. The values stored within\n",
      "          are whatever the type in the sequence is.\n",
      "    \n",
      "        * False : returns an ndarray of integers.\n",
      "    \n",
      "    bins : numpy.ndarray or IntervalIndex.\n",
      "        The computed or specified bins. Only returned when `retbins=True`.\n",
      "        For scalar or sequence `bins`, this is an ndarray with the computed\n",
      "        bins. If set `duplicates=drop`, `bins` will drop non-unique bin. For\n",
      "        an IntervalIndex `bins`, this is equal to `bins`.\n",
      "    \n",
      "    See Also\n",
      "    --------\n",
      "    qcut : Discretize variable into equal-sized buckets based on rank\n",
      "        or based on sample quantiles.\n",
      "    pandas.Categorical : Array type for storing data that come from a\n",
      "        fixed set of values.\n",
      "    Series : One-dimensional array with axis labels (including time series).\n",
      "    pandas.IntervalIndex : Immutable Index implementing an ordered,\n",
      "        sliceable set.\n",
      "    \n",
      "    Notes\n",
      "    -----\n",
      "    Any NA values will be NA in the result. Out of bounds values will be NA in\n",
      "    the resulting Series or pandas.Categorical object.\n",
      "    \n",
      "    Examples\n",
      "    --------\n",
      "    Discretize into three equal-sized bins.\n",
      "    \n",
      "    >>> pd.cut(np.array([1, 7, 5, 4, 6, 3]), 3)\n",
      "    ... # doctest: +ELLIPSIS\n",
      "    [(0.994, 3.0], (5.0, 7.0], (3.0, 5.0], (3.0, 5.0], (5.0, 7.0], ...\n",
      "    Categories (3, interval[float64]): [(0.994, 3.0] < (3.0, 5.0] ...\n",
      "    \n",
      "    >>> pd.cut(np.array([1, 7, 5, 4, 6, 3]), 3, retbins=True)\n",
      "    ... # doctest: +ELLIPSIS\n",
      "    ([(0.994, 3.0], (5.0, 7.0], (3.0, 5.0], (3.0, 5.0], (5.0, 7.0], ...\n",
      "    Categories (3, interval[float64]): [(0.994, 3.0] < (3.0, 5.0] ...\n",
      "    array([0.994, 3.   , 5.   , 7.   ]))\n",
      "    \n",
      "    Discovers the same bins, but assign them specific labels. Notice that\n",
      "    the returned Categorical's categories are `labels` and is ordered.\n",
      "    \n",
      "    >>> pd.cut(np.array([1, 7, 5, 4, 6, 3]),\n",
      "    ...        3, labels=[\"bad\", \"medium\", \"good\"])\n",
      "    [bad, good, medium, medium, good, bad]\n",
      "    Categories (3, object): [bad < medium < good]\n",
      "    \n",
      "    ``labels=False`` implies you just want the bins back.\n",
      "    \n",
      "    >>> pd.cut([0, 1, 1, 2], bins=4, labels=False)\n",
      "    array([0, 1, 1, 3])\n",
      "    \n",
      "    Passing a Series as an input returns a Series with categorical dtype:\n",
      "    \n",
      "    >>> s = pd.Series(np.array([2, 4, 6, 8, 10]),\n",
      "    ...               index=['a', 'b', 'c', 'd', 'e'])\n",
      "    >>> pd.cut(s, 3)\n",
      "    ... # doctest: +ELLIPSIS\n",
      "    a    (1.992, 4.667]\n",
      "    b    (1.992, 4.667]\n",
      "    c    (4.667, 7.333]\n",
      "    d     (7.333, 10.0]\n",
      "    e     (7.333, 10.0]\n",
      "    dtype: category\n",
      "    Categories (3, interval[float64]): [(1.992, 4.667] < (4.667, ...\n",
      "    \n",
      "    Passing a Series as an input returns a Series with mapping value.\n",
      "    It is used to map numerically to intervals based on bins.\n",
      "    \n",
      "    >>> s = pd.Series(np.array([2, 4, 6, 8, 10]),\n",
      "    ...               index=['a', 'b', 'c', 'd', 'e'])\n",
      "    >>> pd.cut(s, [0, 2, 4, 6, 8, 10], labels=False, retbins=True, right=False)\n",
      "    ... # doctest: +ELLIPSIS\n",
      "    (a    0.0\n",
      "     b    1.0\n",
      "     c    2.0\n",
      "     d    3.0\n",
      "     e    4.0\n",
      "     dtype: float64, array([0, 2, 4, 6, 8]))\n",
      "    \n",
      "    Use `drop` optional when bins is not unique\n",
      "    \n",
      "    >>> pd.cut(s, [0, 2, 4, 6, 10, 10], labels=False, retbins=True,\n",
      "    ...    right=False, duplicates='drop')\n",
      "    ... # doctest: +ELLIPSIS\n",
      "    (a    0.0\n",
      "     b    1.0\n",
      "     c    2.0\n",
      "     d    3.0\n",
      "     e    3.0\n",
      "     dtype: float64, array([0, 2, 4, 6, 8]))\n",
      "    \n",
      "    Passing an IntervalIndex for `bins` results in those categories exactly.\n",
      "    Notice that values not covered by the IntervalIndex are set to NaN. 0\n",
      "    is to the left of the first bin (which is closed on the right), and 1.5\n",
      "    falls between two bins.\n",
      "    \n",
      "    >>> bins = pd.IntervalIndex.from_tuples([(0, 1), (2, 3), (4, 5)])\n",
      "    >>> pd.cut([0, 0.5, 1.5, 2.5, 4.5], bins)\n",
      "    [NaN, (0, 1], NaN, (2, 3], (4, 5]]\n",
      "    Categories (3, interval[int64]): [(0, 1] < (2, 3] < (4, 5]]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(pd.cut)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>AgeBand</th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>(-0.08, 16.0]</td>\n",
       "      <td>0.550000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>(16.0, 32.0]</td>\n",
       "      <td>0.370474</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>(32.0, 48.0]</td>\n",
       "      <td>0.349432</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>(48.0, 64.0]</td>\n",
       "      <td>0.434783</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>(64.0, 80.0]</td>\n",
       "      <td>0.090909</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         AgeBand  Survived\n",
       "0  (-0.08, 16.0]  0.550000\n",
       "1   (16.0, 32.0]  0.370474\n",
       "2   (32.0, 48.0]  0.349432\n",
       "3   (48.0, 64.0]  0.434783\n",
       "4   (64.0, 80.0]  0.090909"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df['AgeBand'] = pd.cut(train_df['Age'], 5)\n",
    "train_df[['AgeBand', 'Survived']].groupby(['AgeBand'], as_index=False).mean().sort_values(by='AgeBand', ascending=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "根据分段更改 Age 为有序数值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked</th>\n",
       "      <th>Title</th>\n",
       "      <th>AgeBand</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "      <td>(16.0, 32.0]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C</td>\n",
       "      <td>3</td>\n",
       "      <td>(32.0, 48.0]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>S</td>\n",
       "      <td>2</td>\n",
       "      <td>(16.0, 32.0]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>S</td>\n",
       "      <td>3</td>\n",
       "      <td>(32.0, 48.0]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "      <td>(32.0, 48.0]</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Survived  Pclass  Sex  Age  SibSp  Parch     Fare Embarked  Title  \\\n",
       "0         0       3    0    1      1      0   7.2500        S      1   \n",
       "1         1       1    1    2      1      0  71.2833        C      3   \n",
       "2         1       3    1    1      0      0   7.9250        S      2   \n",
       "3         1       1    1    2      1      0  53.1000        S      3   \n",
       "4         0       3    0    2      0      0   8.0500        S      1   \n",
       "\n",
       "        AgeBand  \n",
       "0  (16.0, 32.0]  \n",
       "1  (32.0, 48.0]  \n",
       "2  (16.0, 32.0]  \n",
       "3  (32.0, 48.0]  \n",
       "4  (32.0, 48.0]  "
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for dataset in combine:    \n",
    "    dataset.loc[ dataset['Age'] <= 16, 'Age'] = 0\n",
    "    dataset.loc[(dataset['Age'] > 16) & (dataset['Age'] <= 32), 'Age'] = 1\n",
    "    dataset.loc[(dataset['Age'] > 32) & (dataset['Age'] <= 48), 'Age'] = 2\n",
    "    dataset.loc[(dataset['Age'] > 48) & (dataset['Age'] <= 64), 'Age'] = 3\n",
    "    dataset.loc[ dataset['Age'] > 64, 'Age']\n",
    "train_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "删除 AgeBand"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked</th>\n",
       "      <th>Title</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>S</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>S</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Survived  Pclass  Sex  Age  SibSp  Parch     Fare Embarked  Title\n",
       "0         0       3    0    1      1      0   7.2500        S      1\n",
       "1         1       1    1    2      1      0  71.2833        C      3\n",
       "2         1       3    1    1      0      0   7.9250        S      2\n",
       "3         1       1    1    2      1      0  53.1000        S      3\n",
       "4         0       3    0    2      0      0   8.0500        S      1"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df = train_df.drop(['AgeBand'], axis=1)\n",
    "combine = [train_df, test_df]\n",
    "train_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 通过现有特征创建新特征\n",
    "\n",
    " Parch and SibSp  -> FamilySize \n",
    " "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>FamilySize</th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>0.724138</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>0.578431</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>0.552795</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7</td>\n",
       "      <td>0.333333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0.303538</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0.200000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>0.136364</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>11</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   FamilySize  Survived\n",
       "3           4  0.724138\n",
       "2           3  0.578431\n",
       "1           2  0.552795\n",
       "6           7  0.333333\n",
       "0           1  0.303538\n",
       "4           5  0.200000\n",
       "5           6  0.136364\n",
       "7           8  0.000000\n",
       "8          11  0.000000"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for dataset in combine:\n",
    "    dataset['FamilySize'] = dataset['SibSp'] + dataset['Parch'] + 1\n",
    "\n",
    "train_df[['FamilySize', 'Survived']].groupby(['FamilySize'], as_index=False).mean().sort_values(by='Survived', ascending=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "创建另一个特征 IsAlone"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>IsAlone</th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0.505650</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>0.303538</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   IsAlone  Survived\n",
       "0        0  0.505650\n",
       "1        1  0.303538"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for dataset in combine:\n",
    "    dataset['IsAlone'] = 0\n",
    "    dataset.loc[dataset['FamilySize'] == 1, 'IsAlone'] = 1\n",
    "    \n",
    "train_df[['IsAlone', 'Survived']].groupby(['IsAlone'], as_index=False).mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "删除 Parch, SibSp, FamilySize 特征，使用 IsAlone 特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked</th>\n",
       "      <th>Title</th>\n",
       "      <th>IsAlone</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>S</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>S</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>S</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Survived  Pclass  Sex  Age     Fare Embarked  Title  IsAlone\n",
       "0         0       3    0    1   7.2500        S      1        0\n",
       "1         1       1    1    2  71.2833        C      3        0\n",
       "2         1       3    1    1   7.9250        S      2        1\n",
       "3         1       1    1    2  53.1000        S      3        0\n",
       "4         0       3    0    2   8.0500        S      1        1"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df = train_df.drop(['Parch', 'SibSp', 'FamilySize'], axis=1)\n",
    "test_df = test_df.drop(['Parch', 'SibSp', 'FamilySize'], axis=1)\n",
    "combine = [train_df, test_df]\n",
    "\n",
    "train_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "创建人工特征: 联合 Pcass 和 Age"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Age*Class</th>\n",
       "      <th>Age</th>\n",
       "      <th>Pclass</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>6</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Age*Class  Age  Pclass\n",
       "0          3    1       3\n",
       "1          2    2       1\n",
       "2          3    1       3\n",
       "3          2    2       1\n",
       "4          6    2       3\n",
       "5          6    2       3\n",
       "6          3    3       1\n",
       "7          0    0       3\n",
       "8          3    1       3\n",
       "9          0    0       2"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for dataset in combine:\n",
    "    dataset['Age*Class'] = dataset.Age * dataset.Pclass\n",
    "    \n",
    "train_df[['Age*Class', 'Age', 'Pclass']].head(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 补全类别特征\n",
    "\n",
    "Embared 特征 S，Q，C，在训练集中有两个缺失值，我们使用频次最高的值补上\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'S'"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "freq_port = train_df.Embarked.dropna().mode()[0]\n",
    "freq_port"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Embarked</th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>C</td>\n",
       "      <td>0.553571</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Q</td>\n",
       "      <td>0.389610</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>S</td>\n",
       "      <td>0.339009</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  Embarked  Survived\n",
       "0        C  0.553571\n",
       "1        Q  0.389610\n",
       "2        S  0.339009"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for dataset in combine:\n",
    "    dataset['Embarked'] = dataset['Embarked'].fillna(freq_port)\n",
    "    \n",
    "train_df[['Embarked', 'Survived']].groupby(['Embarked'], as_index=False).mean().sort_values(by='Survived', ascending=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 转换类别特征为数值型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked</th>\n",
       "      <th>Title</th>\n",
       "      <th>IsAlone</th>\n",
       "      <th>Age*Class</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Survived  Pclass  Sex  Age     Fare  Embarked  Title  IsAlone  Age*Class\n",
       "0         0       3    0    1   7.2500         0      1        0          3\n",
       "1         1       1    1    2  71.2833         1      3        0          2\n",
       "2         1       3    1    1   7.9250         0      2        1          3\n",
       "3         1       1    1    2  53.1000         0      3        0          2\n",
       "4         0       3    0    2   8.0500         0      1        1          6"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for dataset in combine:\n",
    "    dataset['Embarked'] = dataset['Embarked'].map({'S': 0, 'C': 1, 'Q': 2}).astype(int)\n",
    "    \n",
    "train_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 快速补全和转换数值特征\n",
    "\n",
    "现在，我们可以使用 mode 为测试数据集中的单个缺失值补全“Fare”特征，以获取此特征最常出现的值。 我们在一行代码中完成此操作。\n",
    "\n",
    "请注意，由于我们只替换单个值，因此我们不会创建中间新特征或进行任何进一步的相关分析以猜测缺失功能。 完成目标实现了模型算法对非空值进行操作的期望要求。\n",
    "\n",
    "我们可能还希望将票价四舍五入到两位小数，因为它代表货币。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked</th>\n",
       "      <th>Title</th>\n",
       "      <th>IsAlone</th>\n",
       "      <th>Age*Class</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>892</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>7.8292</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>893</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>7.0000</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>894</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>9.6875</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>895</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>8.6625</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>896</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>12.2875</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Pclass  Sex  Age     Fare  Embarked  Title  IsAlone  Age*Class\n",
       "0          892       3    0    2   7.8292         2      1        1          6\n",
       "1          893       3    1    2   7.0000         0      3        0          6\n",
       "2          894       2    0    3   9.6875         2      1        1          6\n",
       "3          895       3    0    1   8.6625         0      1        1          3\n",
       "4          896       3    1    1  12.2875         0      3        0          3"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_df['Fare'].fillna(test_df['Fare'].dropna().median(), inplace=True)\n",
    "test_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "创建 FareBand"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on function qcut in module pandas.core.reshape.tile:\n",
      "\n",
      "qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise')\n",
      "    Quantile-based discretization function. Discretize variable into\n",
      "    equal-sized buckets based on rank or based on sample quantiles. For example\n",
      "    1000 values for 10 quantiles would produce a Categorical object indicating\n",
      "    quantile membership for each data point.\n",
      "    \n",
      "    Parameters\n",
      "    ----------\n",
      "    x : 1d ndarray or Series\n",
      "    q : integer or array of quantiles\n",
      "        Number of quantiles. 10 for deciles, 4 for quartiles, etc. Alternately\n",
      "        array of quantiles, e.g. [0, .25, .5, .75, 1.] for quartiles\n",
      "    labels : array or boolean, default None\n",
      "        Used as labels for the resulting bins. Must be of the same length as\n",
      "        the resulting bins. If False, return only integer indicators of the\n",
      "        bins.\n",
      "    retbins : bool, optional\n",
      "        Whether to return the (bins, labels) or not. Can be useful if bins\n",
      "        is given as a scalar.\n",
      "    precision : int, optional\n",
      "        The precision at which to store and display the bins labels\n",
      "    duplicates : {default 'raise', 'drop'}, optional\n",
      "        If bin edges are not unique, raise ValueError or drop non-uniques.\n",
      "    \n",
      "        .. versionadded:: 0.20.0\n",
      "    \n",
      "    Returns\n",
      "    -------\n",
      "    out : Categorical or Series or array of integers if labels is False\n",
      "        The return type (Categorical or Series) depends on the input: a Series\n",
      "        of type category if input is a Series else Categorical. Bins are\n",
      "        represented as categories when categorical data is returned.\n",
      "    bins : ndarray of floats\n",
      "        Returned only if `retbins` is True.\n",
      "    \n",
      "    Notes\n",
      "    -----\n",
      "    Out of bounds values will be NA in the resulting Categorical object\n",
      "    \n",
      "    Examples\n",
      "    --------\n",
      "    >>> pd.qcut(range(5), 4)\n",
      "    ... # doctest: +ELLIPSIS\n",
      "    [(-0.001, 1.0], (-0.001, 1.0], (1.0, 2.0], (2.0, 3.0], (3.0, 4.0]]\n",
      "    Categories (4, interval[float64]): [(-0.001, 1.0] < (1.0, 2.0] ...\n",
      "    \n",
      "    >>> pd.qcut(range(5), 3, labels=[\"good\", \"medium\", \"bad\"])\n",
      "    ... # doctest: +SKIP\n",
      "    [good, good, medium, bad, bad]\n",
      "    Categories (3, object): [good < medium < bad]\n",
      "    \n",
      "    >>> pd.qcut(range(5), 4, labels=False)\n",
      "    array([0, 0, 1, 2, 3])\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(pd.qcut)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>FareBand</th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>(-0.001, 7.91]</td>\n",
       "      <td>0.197309</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>(7.91, 14.454]</td>\n",
       "      <td>0.303571</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>(14.454, 31.0]</td>\n",
       "      <td>0.454955</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>(31.0, 512.329]</td>\n",
       "      <td>0.581081</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          FareBand  Survived\n",
       "0   (-0.001, 7.91]  0.197309\n",
       "1   (7.91, 14.454]  0.303571\n",
       "2   (14.454, 31.0]  0.454955\n",
       "3  (31.0, 512.329]  0.581081"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df['FareBand'] = pd.qcut(train_df['Fare'], 4)\n",
    "train_df[['FareBand', 'Survived']].groupby(['FareBand'], as_index=False).mean().sort_values(by='Survived', ascending=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "根据 FareBand 将 Fare 转换为有序数值型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked</th>\n",
       "      <th>Title</th>\n",
       "      <th>IsAlone</th>\n",
       "      <th>Age*Class</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Survived  Pclass  Sex  Age  Fare  Embarked  Title  IsAlone  Age*Class\n",
       "0         0       3    0    1     0         0      1        0          3\n",
       "1         1       1    1    2     3         1      3        0          2\n",
       "2         1       3    1    1     1         0      2        1          3\n",
       "3         1       1    1    2     3         0      3        0          2\n",
       "4         0       3    0    2     1         0      1        1          6\n",
       "5         0       3    0    2     1         2      1        1          6\n",
       "6         0       1    0    3     3         0      1        1          3\n",
       "7         0       3    0    0     2         0      4        0          0\n",
       "8         1       3    1    1     1         0      3        0          3\n",
       "9         1       2    1    0     2         1      3        0          0"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "for dataset in combine:\n",
    "    dataset.loc[ dataset['Fare'] <= 7.91, 'Fare'] = 0\n",
    "    dataset.loc[(dataset['Fare'] > 7.91) & (dataset['Fare'] <= 14.454), 'Fare'] = 1\n",
    "    dataset.loc[(dataset['Fare'] > 14.454) & (dataset['Fare'] <= 31), 'Fare']   = 2\n",
    "    dataset.loc[ dataset['Fare'] > 31, 'Fare'] = 3\n",
    "    dataset['Fare'] = dataset['Fare'].astype(int)\n",
    "\n",
    "train_df = train_df.drop(['FareBand'], axis=1)\n",
    "combine = [train_df, test_df]\n",
    "    \n",
    "train_df.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked</th>\n",
       "      <th>Title</th>\n",
       "      <th>IsAlone</th>\n",
       "      <th>Age*Class</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>892</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>893</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>894</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>895</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>896</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>897</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>898</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>899</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>900</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>901</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Pclass  Sex  Age  Fare  Embarked  Title  IsAlone  Age*Class\n",
       "0          892       3    0    2     0         2      1        1          6\n",
       "1          893       3    1    2     0         0      3        0          6\n",
       "2          894       2    0    3     1         2      1        1          6\n",
       "3          895       3    0    1     1         0      1        1          3\n",
       "4          896       3    1    1     1         0      3        0          3\n",
       "5          897       3    0    0     1         0      1        1          0\n",
       "6          898       3    1    1     0         2      2        1          3\n",
       "7          899       2    0    1     2         0      1        0          2\n",
       "8          900       3    1    1     0         1      3        1          3\n",
       "9          901       3    0    1     2         0      1        0          3"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_df.head(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 特征相关性热度图\n",
    "survieved 与其它特征之间的关系\n",
    "\n",
    "首先要注意的是，只有数值特征进行比较\n",
    "\n",
    "正相关：如果特征A的增加导致特征b的增加，那么它们呈正相关。值1表示完全正相关。\n",
    "\n",
    "负相关：如果特征A的增加导致特征b的减少，则呈负相关。值-1表示完全负相关。\n",
    "\n",
    "现在让我们说两个特性是高度或完全相关的，所以一个增加导致另一个增加。这意味着两个特征都包含高度相似的信息，并且信息很少或没有变化。这样的特征对我们来说是没有价值的！\n",
    "\n",
    "那么你认为我们应该同时使用它们吗？。在制作或训练模型时，我们应该尽量减少冗余特性，因为它减少了训练时间和许多优点。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "corrmat = train_df.corr()\n",
    "\n",
    "k = 10\n",
    "cols = corrmat.nlargest(k,'Survived')['Survived'].index  #取出与Survived相关性最大的十项\n",
    "cm = np.corrcoef(train_df[cols].values.T)  #相关系数 \n",
    "sns.set(font_scale = 1.25)\n",
    "hm = sns.heatmap(cm,cbar = True,annot = True,square = True ,fmt = '.2f',annot_kws = {'size': 10},yticklabels = cols.values,xticklabels = cols.values)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x576 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.heatmap(train_df.corr(),annot=True,cmap='RdYlGn',linewidths=0.2) #data.corr()-->correlation matrix\n",
    "fig=plt.gcf()\n",
    "fig.set_size_inches(10,8)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型，预测，解决问题\n",
    "\n",
    "现在我们准备训练模型并预测所需的解决方案。 有60多种预测建模算法可供选择。 我们必须了解问题的类型和解决方案要求，以缩小到我们可以评估的少数几个模型。 我们的问题是分类和回归问题。 我们想要确定输出（生存与否）与其他变量或特征（性别，年龄，港口......）之间的关系。 我们还确定了一种机器学习，称为监督学习，因为我们正在使用给定的数据集训练我们的模型。 有了这两个标准 - 监督学习加分类和回归，我们可以将我们选择的模型缩小到几个。\n",
    "\n",
    "- Logistic Regression\n",
    "- KNN or k-Nearest Neighbors\n",
    "- Support Vector Machines\n",
    "- Naive Bayes classifier\n",
    "- Decision Tree\n",
    "- Random Forrest\n",
    "- Perceptron\n",
    "- Artificial neural network\n",
    "- RVM or Relevance Vector Machine"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((891, 8), (891,), (418, 8))"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train = train_df.drop('Survived', axis=1)\n",
    "Y_train = train_df['Survived']\n",
    "X_test = test_df.drop('PassengerId', axis=1).copy()\n",
    "X_train.shape, Y_train.shape, X_test.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Logistic Regression\n",
    "\n",
    "Logistic Regression 是在工作流程中尽早运行的有用模型。 逻辑回归通过使用逻辑函数估计概率来测量分类因变量（特征）与一个或多个自变量（特征）之间的关系，逻辑函数是累积逻辑分布。\n",
    "\n",
    "请注意模型基于我们的训练数据集生成置信度分数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on method score in module sklearn.base:\n",
      "\n",
      "score(X, y, sample_weight=None) method of sklearn.linear_model.logistic.LogisticRegression instance\n",
      "    Returns the mean accuracy on the given test data and labels.\n",
      "    \n",
      "    In multi-label classification, this is the subset accuracy\n",
      "    which is a harsh metric since you require for each sample that\n",
      "    each label set be correctly predicted.\n",
      "    \n",
      "    Parameters\n",
      "    ----------\n",
      "    X : array-like, shape = (n_samples, n_features)\n",
      "        Test samples.\n",
      "    \n",
      "    y : array-like, shape = (n_samples) or (n_samples, n_outputs)\n",
      "        True labels for X.\n",
      "    \n",
      "    sample_weight : array-like, shape = [n_samples], optional\n",
      "        Sample weights.\n",
      "    \n",
      "    Returns\n",
      "    -------\n",
      "    score : float\n",
      "        Mean accuracy of self.predict(X) wrt. y.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(LogisticRegression().score)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "80.02"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Logistic Regression\n",
    "\n",
    "logreg = LogisticRegression()\n",
    "logreg.fit(X_train, Y_train)\n",
    "Y_pred = logreg.predict(X_test)\n",
    "acc_log = round(logreg.score(X_train, Y_train) * 100, 2)\n",
    "\n",
    "acc_log"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们可以使用逻辑回归来验证我们的假设和决策。 这可以通过计算决策函数中的特征的系数来完成。\n",
    "\n",
    "正系数增加了响应的对数几率（从而增加了概率），负系数降低了响应的对数几率（从而降低了概率）。\n",
    "\n",
    "- "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['Survived', 'Pclass', 'Sex', 'Age', 'Fare', 'Embarked', 'Title',\n",
       "       'IsAlone', 'Age*Class'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Feature</th>\n",
       "      <th>Correlation</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Sex</td>\n",
       "      <td>2.197635</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Title</td>\n",
       "      <td>0.388109</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Embarked</td>\n",
       "      <td>0.370364</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Age</td>\n",
       "      <td>0.213659</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>IsAlone</td>\n",
       "      <td>0.122867</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Fare</td>\n",
       "      <td>-0.073902</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>Age*Class</td>\n",
       "      <td>-0.237651</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Pclass</td>\n",
       "      <td>-0.741593</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     Feature  Correlation\n",
       "1        Sex     2.197635\n",
       "5      Title     0.388109\n",
       "4   Embarked     0.370364\n",
       "2        Age     0.213659\n",
       "6    IsAlone     0.122867\n",
       "3       Fare    -0.073902\n",
       "7  Age*Class    -0.237651\n",
       "0     Pclass    -0.741593"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "coeff_df = pd.DataFrame(train_df.columns.delete(0))\n",
    "coeff_df.columns = ['Feature']\n",
    "\n",
    "coeff_df['Correlation'] = pd.Series(logreg.coef_[0])\n",
    "coeff_df.sort_values(by='Correlation', ascending=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Support Vector Machines\n",
    "\n",
    "支持向量机是一个监督学习模型，适用于分类和回归问题。 给定一组训练样本，每个训练样本被标记为属于两个类别中的一个或另一个，SVM训练算法构建将新测试样本分配给一个类别或另一个类别的模型，使其成为非概率二元线性分类器。（即二分类模型）\n",
    "\n",
    "请注意，该模型生成的置信度得分高于逻辑回归模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:196: FutureWarning: The default value of gamma will change from 'auto' to 'scale' in version 0.22 to account better for unscaled features. Set gamma explicitly to 'auto' or 'scale' to avoid this warning.\n",
      "  \"avoid this warning.\", FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "84.06"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Support Vector Machines\n",
    "svc = SVC()\n",
    "svc.fit(X_train, Y_train)\n",
    "Y_pred = svc.predict(X_test)\n",
    "acc_svc = round(svc.score(X_train, Y_train) * 100, 2)\n",
    "acc_svc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\svm\\base.py:931: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.\n",
      "  \"the number of iterations.\", ConvergenceWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "79.46"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Linear SVC\n",
    "\n",
    "linear_svc = LinearSVC()\n",
    "linear_svc.fit(X_train, Y_train)\n",
    "Y_pred = linear_svc.predict(X_test)\n",
    "acc_linear_svc = round(linear_svc.score(X_train, Y_train) * 100, 2)\n",
    "acc_linear_svc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Feature</th>\n",
       "      <th>Correlation</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Sex</td>\n",
       "      <td>0.865140</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Title</td>\n",
       "      <td>0.143921</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Embarked</td>\n",
       "      <td>0.113207</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>IsAlone</td>\n",
       "      <td>0.056327</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Age</td>\n",
       "      <td>0.020606</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Fare</td>\n",
       "      <td>-0.028662</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>Age*Class</td>\n",
       "      <td>-0.052174</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Pclass</td>\n",
       "      <td>-0.278452</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     Feature  Correlation\n",
       "1        Sex     0.865140\n",
       "5      Title     0.143921\n",
       "4   Embarked     0.113207\n",
       "6    IsAlone     0.056327\n",
       "2        Age     0.020606\n",
       "3       Fare    -0.028662\n",
       "7  Age*Class    -0.052174\n",
       "0     Pclass    -0.278452"
      ]
     },
     "execution_count": 118,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "coeff_df = pd.DataFrame(train_df.columns.delete(0))\n",
    "coeff_df.columns = ['Feature']\n",
    "\n",
    "coeff_df['Correlation'] = pd.Series(linear_svc.coef_[0])\n",
    "coeff_df.sort_values(by='Correlation', ascending=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### KNN\n",
    "\n",
    "在模式识别中，k 近邻算法是一个非参数方法，用于分类和回归。 样本按其邻居的多数票进行分类，样本被分配给其k个最近邻居中最常见的类（k是正整数，通常很小）。 如果k = 1，则简单地将对象分配给该单个最近邻居的类。 \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "84.74"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn = KNeighborsClassifier(n_neighbors = 3)\n",
    "knn.fit(X_train, Y_train)\n",
    "Y_pred = knn.predict(X_test)\n",
    "acc_knn = round(knn.score(X_train, Y_train) * 100, 2)\n",
    "acc_knn"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Naive Bayes\n",
    "\n",
    "朴素贝叶斯分类器是一系列简单的概率分类器，它基于贝叶斯定理应用特征之间的强（天真）独立假设。 朴素贝叶斯分类器具有高度可扩展性，在学习问题中需要多个变量（特征）数量的线性参数。 \n",
    "\n",
    "模型生成的置信度得分是迄今为止评估的模型中最低的。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "72.84"
      ]
     },
     "execution_count": 104,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Gaussian Naive Bayes\n",
    "\n",
    "gaussian = GaussianNB()\n",
    "gaussian.fit(X_train, Y_train)\n",
    "Y_pred = gaussian.predict(X_test)\n",
    "acc_gaussian = round(gaussian.score(X_train, Y_train) * 100, 2)\n",
    "acc_gaussian"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Perceptron\n",
    "\n",
    "感知器是用于二元分类器的监督学习的算法（可以决定由数字向量表示的输入是否属于某个特定类的函数）。 它是一种线性分类器，即一种分类算法，其基于将一组权重与特征向量组合的线性预测器函数进行其预测。 该算法允许在线学习，因为它一次一个地处理训练集中的元素。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in Perceptron in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "79.35"
      ]
     },
     "execution_count": 106,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "perceptron = Perceptron()\n",
    "perceptron.fit(X_train, Y_train)\n",
    "Y_pred = perceptron.predict(X_test)\n",
    "acc_perceptron = round(perceptron.score(X_train, Y_train) * 100, 2)\n",
    "acc_perceptron"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Feature</th>\n",
       "      <th>Correlation</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Sex</td>\n",
       "      <td>67.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>IsAlone</td>\n",
       "      <td>20.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Embarked</td>\n",
       "      <td>13.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Title</td>\n",
       "      <td>-1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Age</td>\n",
       "      <td>-3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>Age*Class</td>\n",
       "      <td>-6.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Fare</td>\n",
       "      <td>-12.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Pclass</td>\n",
       "      <td>-22.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     Feature  Correlation\n",
       "1        Sex         67.0\n",
       "6    IsAlone         20.0\n",
       "4   Embarked         13.0\n",
       "5      Title         -1.0\n",
       "2        Age         -3.0\n",
       "7  Age*Class         -6.0\n",
       "3       Fare        -12.0\n",
       "0     Pclass        -22.0"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "coeff_df = pd.DataFrame(train_df.columns.delete(0))\n",
    "coeff_df.columns = ['Feature']\n",
    "\n",
    "coeff_df['Correlation'] = pd.Series(perceptron.coef_[0])\n",
    "coeff_df.sort_values(by='Correlation', ascending=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\xukaihui\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:166: FutureWarning: max_iter and tol parameters have been added in SGDClassifier in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "75.53"
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Stochastic Gradient Descent\n",
    "\n",
    "sgd = SGDClassifier()\n",
    "sgd.fit(X_train, Y_train)\n",
    "Y_pred = sgd.predict(X_test)\n",
    "acc_sgd = round(sgd.score(X_train, Y_train) * 100, 2)\n",
    "acc_sgd"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Decision Tree\n",
    "\n",
    "该模型使用决策树作为预测模型，将特征（树枝）映射到关于目标值（树叶）的结论。 目标变量可以采用有限值集的树模型称为分类树; 在这些树结构中，叶子表示类标签，分支表示导致这些类标签的特征的连接。 目标变量可以采用连续值（通常是实数）的决策树称为回归树。\n",
    "\n",
    "到目前为止评估的模型中模型置信度得分最高。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "87.54"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Decison Tree\n",
    "\n",
    "decision_tree = DecisionTreeClassifier()\n",
    "decision_tree.fit(X_train, Y_train)\n",
    "Y_pred = decision_tree.predict(X_test)\n",
    "acc_decision_tree = round(decision_tree.score(X_train, Y_train) * 100, 2)\n",
    "acc_decision_tree"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.16174926, 0.01583339, 0.0149625 , 0.09561257, 0.04841336,\n",
       "       0.56858011, 0.03048879, 0.06436002])"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "decision_tree.feature_importances_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Random Forest\n",
    "\n",
    "随机森林是最受欢迎的模型之一。 随机森林或随机决策森林是用于分类，回归和其他任务的集成学习方法，其通过在训练时构建多个决策树（n_estimators = 100）并输出作为类的模式的类（分类）来操作。 或者表示各树的预测（回归）。\n",
    "\n",
    "到目前为止评估的模型中模型置信度得分最高。 我们决定使用此模型的输出（Y_pred）来创建竞赛结果提交。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "87.54"
      ]
     },
     "execution_count": 119,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Random Forest\n",
    "\n",
    "random_forest = RandomForestClassifier(n_estimators=100)\n",
    "random_forest.fit(X_train, Y_train)\n",
    "Y_pred = random_forest.predict(X_test)\n",
    "random_forest.score(X_train, Y_train)\n",
    "acc_random_forest = round(random_forest.score(X_train, Y_train) * 100, 2)\n",
    "acc_random_forest"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型评估\n",
    "\n",
    "现在我们对所有模型的评估结果进行排序，选择一个结果最好的模型。虽然决策树和随机森林得分相同，但我们选择使用随机森林来纠正决策树可能过度拟合其训练集的情况。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Model</th>\n",
       "      <th>Score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Random Forest</td>\n",
       "      <td>87.54</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>Decison Tree</td>\n",
       "      <td>87.54</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>KNN</td>\n",
       "      <td>84.74</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Support Vector Machine</td>\n",
       "      <td>84.06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Logistic Regression</td>\n",
       "      <td>80.02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>Linear SVC</td>\n",
       "      <td>79.46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Perception</td>\n",
       "      <td>79.35</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Stochastic Gradient Decent</td>\n",
       "      <td>75.53</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Naive Bayes</td>\n",
       "      <td>72.84</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                        Model  Score\n",
       "3               Random Forest  87.54\n",
       "8                Decison Tree  87.54\n",
       "1                         KNN  84.74\n",
       "0      Support Vector Machine  84.06\n",
       "2         Logistic Regression  80.02\n",
       "7                  Linear SVC  79.46\n",
       "5                  Perception  79.35\n",
       "6  Stochastic Gradient Decent  75.53\n",
       "4                 Naive Bayes  72.84"
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "models = pd.DataFrame({\n",
    "    'Model': ['Support Vector Machine', 'KNN', 'Logistic Regression',\n",
    "             'Random Forest',' Naive Bayes', 'Perception', 'Stochastic Gradient Decent', \n",
    "              'Linear SVC', 'Decison Tree'],\n",
    "    'Score': [acc_svc, acc_knn, acc_log, \n",
    "              acc_random_forest, acc_gaussian, acc_perceptron, \n",
    "              acc_sgd, acc_linear_svc, acc_decision_tree]\n",
    "})\n",
    "\n",
    "models.sort_values(by='Score', ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [],
   "source": [
    "submision = pd.DataFrame({\"PassengerId\": test_df[\"PassengerId\"],\n",
    "                         \"Survived\": Y_pred})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Socre 0.77511, \n",
    "submision.to_csv('./output/submisson.csv', index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": true,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "192px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
